Service与Bind Service

96
BlackL
2016.02.28 21:27* 字数 648

通过startService()bindService()两种方式启动的Service的生命周期




可以看到普通Service是通过startService()来启动的,而bind service则是通过在相应组件中调用onBind()方法来与service绑定(四大组件中唯有Broadcast Receiver无法与service绑定)。
要注意的是service默认情况下是在UI线程中运行的,所以当要在service中进行阻塞型操作时最好在service中单独开一个线程。

如上图所示,通过startService()启动的service会在onCreate()方法之后调用onStartCommand()方法,而通过此方法启动的service没有与组件绑定,该service应在完成任务时自己调用stopSelf()方法,或在其他组件中调用stopService()方法。
而通过onBind()方法启动的service则会在onCreate()方法之后调用onBind()方法,该方法会返回一个Binder对象,与该service绑定的组件一般是通过返回的这个Binder对象进行与service之间的通信。当所有绑定与该service的组件分别都调用unBindService()时,该service便会被销毁。



bind service



在组件中调用onBind()方法时需要传入一个ServiceConnection对象。

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
        // This is called when the connection with the service has been
        // established, giving us the object we can use to
        // interact with the service.  We are communicating with the
        // service using a Messenger, so here we get a client-side
        // representation of that from the raw IBinder object.
    }

    public void onServiceDisconnected(ComponentName className) {
        // This is called when the connection with the service has been
        // unexpectedly disconnected -- that is, its process crashed.
    }
};

可以看到onServiceConnected()方法中有一个IBinder对象,这个IBinder对象即为Service中onBind()方法返回的对象(IBinder为一个接口,Binder实现了个这个接口)。同样可以看到onServiceDisconnected()方法中的注释,这个方法只有在非正常情况下service与组件连接中断时才会调用。

注意:

  • 当你的activity需要在可见时才需要同service交互则需要在activity的onStart()中绑定service,并在onStop()方法中解除绑定。
  • 若当在activity在后台时仍需要与service交互,则需要在onCreate()方法中绑定,并在onDestory()方法中解除绑定。

startService()bindService()共同出现的情况


如上图,可以看到当所有与service绑定的组件都调用了unBind()方法时,若在这之后service调用stopSelf()或其他组件调用stopService()方法后service才会被销毁。这期间有别的组件重新调用onBind()方法,若该service的onUnbind()方法返回true则会调用onRebind()方法,若返回false则会直接调用onBind()方法。

Android