Android之 服务

Posted 猫咪大王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android之 服务相关的知识,希望对你有一定的参考价值。

1 简介

服务是android四大组件之一。不过与Activity不同的是,服务不会直接与用户交互,而是摸摸地在后台运行。

有两种方式来启动系统服务。

一种是调用 Context.startService() 方法。另一种是调用 Context.bindService() 方法。

 

2 服务的生命周期

下面这张图说明了服务的生命周期。当用户调用Context.startService()或者Context.binService()时,系统会启动服务。

如果服务没有创建,那么系统首先会调用Service类中的onCreate()方法,然后onStart()方法或者onBind()方法将会执行,开启一个服务。

服务会一直默默地在后台进行,调用Context.stopService()或stopSelf()方法,服务中的onDestroy()会执行,销毁服务。

当通过Context.bindService()开启服务后,必须通过Context.unbindService()停止服务。

 

 

3 实例

3.1 通过Context.startService()启动服务

首先新建一个类,继承Service类。

public class MyService extends Service{
    
    @Override
    public IBinder onBind(Intent intent){
        return null;
    }
    
    @Override
    public void onCreate(){
        super.onCreate();
        Log.d("MyService","onCreate executed!");
    }
    
    @Override
    public void onStart(Intent intent, int startId){
        super.onStart();
        Log.d("MyService","onStart executed!");
    }
    
    @Override
    public void onDestroy(){
        super.onDestroy();
        Log.d("MyService","onDestroy executed!");
    }
    
}

然后在活动中通过点击按钮,实现活动的启动或停止。

 3.1 通过Context.bindService()启动服务

 上面的方式,我们只能通过活动界面的按钮来启动和停止服务。如果服务想要跟活动更多的交流,就需要采用另外一种方式来开启活动。

1、通过Context.bindService()启动服务,我们同样需要继承Service类,重写onBind()方法。

在onBind()方法中我们返回一个Binder对象。Binder类的API定义如下:

下面是具体代码:

public class MyService extends Service {
    private DownloadBinder mBinder = new DownloadBinder();
    
    DownloadBinder extends Binder {
        public void startDownload() {
            Log.d("MyService", "startDownload executed");
        }
        public int getProgress() {
            Log.d("MyService", "getProgress executed");
            return 0;
        }
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    ……
}

 可以看到我们定义了一个内部类DownloadBinder继承自Binder,在这个类中我们实现了两个方法,用于启动下载和获取进度。

2、接下来就是在活动中通过Context.bindService()启动服务,并且用上面的DownloadBinder中定义的方法,与服务随时交互。

下面是具体代码

public class MainActivity extends Activity implements OnClickListener {

    private Button bindService;
    private Button unbindService;
    
    private MyService.DownloadBinder downloadBinder;
    private ServiceConnection connection = new ServiceConnection() {
    
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
        
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            downloadBinder = (MyService.DownloadBinder) service;
            downloadBinder.startDownload();
            downloadBinder.getProgress();
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ……
        bindService = (Button) findViewById(R.id.bind_service);
        unbindService = (Button) findViewById(R.id.unbind_service);
        bindService.setOnClickListener(this);
        unbindService.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bind_service:
            Intent bindIntent = new Intent(this, MyService.class);
            bindService(bindIntent, connection, BIND_AUTO_CREATE); // 绑定服务
            break;
        case R.id.unbind_service:
            unbindService(connection); // 解绑服务
            break;
        default:
        break;
        }
    }
}

 

以上是关于Android之 服务的主要内容,如果未能解决你的问题,请参考以下文章

详解Android WebView加载html片段

在 android 首选项片段中使用 startService()

从片段调用 Google Play 游戏服务

Android代码片段

在标签片段android中添加谷歌地点选择器

Android课程---Android Studio使用小技巧:提取方法代码片段