通过startService()
与bindService()
两种方式启动的Service的生命周期
<br />
可以看到普通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便会被销毁。
<br />
<br />
bind service
<br />
在组件中调用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()
方法中解除绑定。
</br>
startService()
与bindService()
共同出现的情况
</br>
如上图,可以看到当所有与service绑定的组件都调用了unBind()
方法时,若在这之后service调用stopSelf()
或其他组件调用stopService()
方法后service才会被销毁。这期间有别的组件重新调用onBind()
方法,若该service的onUnbind()
方法返回true则会调用onRebind()
方法,若返回false则会直接调用onBind()
方法。
网友评论