服务的生命周期---从创建到销毁---可以被分为以下两个路径:
1. 启动类型的服务:
一个组件调用startService()方法创建服务,然后服务无限期的运行,并且必须通过调用stopSelf()方法来终止自己。其他组件也能够通过调用stopService()方法来终止这个服务。当服务被终止,系统就会把它销毁。
2. 绑定类型的服务:
一个组件(客户端)调用bindService()方法创建服务,客户端通过IBinder接口与服务通信。客户端能够调用unbindService()方法来关闭与服务连接。多个客户端能够绑定到统一个服务,并且当所有的都解绑以后,系统就会销毁这个服务。(服务不需要终止自己)
这两个路径不是完全独立的。也就是说,你能够绑定一个已经用startService()方法启动的服务。例如,一个后台的音乐服务能够调用带有标识要播放的音乐的Itent的startService()方法来启动,稍后,可能在用户想要进行一些播放器的控制时,或想要获取有关当前歌曲信息,那么一个Activity就能够调用bindService()方法来绑定这个服务。在这个场景中,直到所有的客户端解绑,stopService()或stopSelf()方法才能实际终止这个服务。
实现生命周期的回调方法
像Activity一样,服务也有生命周期回调方法,你实现这些回调方法来监视服务内状态的改变,在合适的时机执行工作。下面的服务框架演示了每个生命周期的回调方法:
public class ExampleService extends Service {
int mStartMode; // indicates how to behave if the service is killed
IBinder mBinder; // interface for clients that bind
boolean mAllowRebind; // indicates whether onRebind should be used
@Override
public void onCreate() {
// The service is being created
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// The service is starting, due to a call to startService()
return mStartMode;
}
@Override
public IBinder onBind(Intent intent) {
// A client is binding to the service with bindService()
return mBinder;
}
@Override
public boolean onUnbind(Intent intent) {
// All clients have unbound with unbindService()
return mAllowRebind;
}
@Override
public void onRebind(Intent intent) {
// A client is binding to the service with bindService(),
// after onUnbind() has already been called
}
@Override
public void onDestroy() {
// The service is no longer used and is being destroyed
}
}
注意:跟Activity生命周期的回调方法不同,你不需要调用这些回调方法的父类实现。
通过实现这些回调方法,你能够监视服务生命周期的两个嵌套循环:
1. 发生在onCreate()和onDestroy()方法调用之间的服务的整个生命时间,跟Activity一样,服务在onCreate()方法完成初始化安装,在onDestroy()方法中释放所有的保留资源。例如,一个音乐回放的服务能够在onCreate()方法中播放音乐的地方创建一个线程,然后在onDestroy()方法中终止这个线程。
所有的服务都会调用OnCreate()和onDestroy()方法,不管是startService()方法还是bindService()方法创建的服务。
2. 调用onStartCommand()或onBind()方法开始服务的活动生命时,每个方法都分别处理传递给startService()或bindService()方法的Intent。
如果是启动类型的服务,那么活动生命时的结束时机与完整生命时的结束时机相同(服务一直存活到onStartCommand()方法返回之后)。如果是绑定类型的服务,那么活动生命时在onUnbind()方法返回时结束。
注意:尽管启动类型的服务通过吊桶stopSelf()或stopService()方法来终止服务,但是有的服务没有对应回调方法(如没有onStop()回调方法)。因此,除非服务被绑定到了客户端,否则在服务被终止时(只在接受onDestroy()回调方法的时候)系统就会销毁它。
图2说明了一个服务的典型回调方法。尽管这个图把由startService()方法创建的服务与由bindService()方法创建的服务给分开了,但是请记住,任何服务,不管它是怎样启动的,都可能允许客户绑定它。因此用onStartCommand()方法(通过一个客户端调用startService()方法)初始启动的服务,依然能够接收onBind()的调用(在客户端调用bindService()方法时)。
图2.服务的生命周期。图的左边显示了用startService()方法创建服务时的生命周期,图的右边显示了用bindService()方法创建服务时的生命周期。
关于创建提供绑定能力服务的更多信息,请看绑定服务(Bound Services)文档,这份文档的“管理绑定类型服务的生命周期”一节中包含了更多的关于onRebind()回调方法的信息。