现在的位置: 首页 > 综合 > 正文

Android Service—管理服务的生命周期

2013年08月28日 ⁄ 综合 ⁄ 共 2621字 ⁄ 字号 评论关闭

服务的生命周期跟Activity的生命周期类似。但是生命周期甚至比你关注服务如何创建和销毁更重要,因为服务能够在用户不知情的情况下在后台运行。

服务的生命周期---从创建到销毁---可以被分为以下两个路径:

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()方法时)。

pic

图2.服务的生命周期。图的左边显示了用startService()方法创建服务时的生命周期,图的右边显示了用bindService()方法创建服务时的生命周期。

关于创建提供绑定能力服务的更多信息,请看绑定服务(Bound Services)文档,这份文档的“管理绑定类型服务的生命周期”一节中包含了更多的关于onRebind()回调方法的信息。

【上篇】
【下篇】

抱歉!评论已关闭.