Service的生命周期

Posted lgz0921

tags:

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

谷歌官网的一张Service的生命周期图: 

在Service的生命周期里,常用的方法有:

  • 6个内部自动调用的方法

内部自动调用的方法

作用

onCreat()

创建服务

onStartCommand()

开始服务

onBind()

绑定服务

onUnbind()

解绑服务

onRebind()

解绑后重新绑定服务

onDestroy()销毁服务

 上面6种内部自动调用的生命周期方法

class ExampleService : Service() {
    private var startMode: Int = 0             // indicates how to behave if the service is killed
    private var binder: IBinder? = null        // interface for clients that bind
    private var allowRebind: Boolean = false   // indicates whether onRebind should be used

    override fun onCreate() {
        // The service is being created
    }
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        // The service is starting, due to a call to startService()
        return mStartMode
    }
    override fun onBind(intent: Intent): IBinder? {
        // A client is binding to the service with bindService()
        return mBinder
    }
    override fun onUnbind(intent: Intent): Boolean {
        // All clients have unbound with unbindService()
        return mAllowRebind
    }
    override fun onRebind(intent: Intent) {
        // A client is binding to the service with bindService(),
        // after onUnbind() has already been called
    }
    override fun onDestroy() {
        // The service is no longer used and is being destroyed
    }
}

对其中的四个进行说明(引用的谷歌官网原话) 

onStartCommand()

当另一个组件(如 Activity)请求启动服务时,系统会通过调用 startService() 来调用此方法。执行此方法时,服务即会启动并可在后台无限期运行。如果您实现此方法,则在服务工作完成后,您需负责通过调用 stopSelf() 或 stopService() 来停止服务。(如果您只想提供绑定,则无需实现此方法。)

onBind()

当另一个组件想要与服务绑定(例如执行 RPC)时,系统会通过调用 bindService() 来调用此方法。在此方法的实现中,您必须通过返回 IBinder 提供一个接口,以供客户端用来与服务进行通信。请务必实现此方法;但是,如果您并不希望允许绑定,则应返回 null。

onCreate()

首次创建服务时,系统会(在调用 onStartCommand() 或 onBind() 之前)调用此方法来执行一次性设置程序。如果服务已在运行,则不会调用此方法。

onDestroy()

当不再使用服务且准备将其销毁时,系统会调用此方法。服务应通过实现此方法来清理任何资源,如线程、注册的侦听器、接收器等。这是服务接收的最后一个调用。

  • 4个手动调用的方法

手动调用方法

作用

startService()

启动服务

stopService()

关闭服务

bindService()

绑定服务

unbindService()

解绑服务

注意:

  • startService()和stopService()只能开启和关闭Service,无法操作Service; bindService()和unbindService()可以操作Service
  • startService()开启的Service,调用者退出后Service仍然存在; bindService()开启的Service,调用者退出后,Service随着调用者销毁。

解释上面两句话:

        如果组件通过调用 startService() 启动服务(这会引起对 onStartCommand() 的调用),则服务会一直运行,直到其使用 stopself() 自行停止运行,或由其他组件通过调用 stopService() 将其停止为止。

        如果组件通过调用 bindService() 来创建服务,且调用 onStartCommand() ,则服务只会在该组件与其绑定时运行。当该服务与其所有组件取消绑定后,系统便会将其销毁。

上面4种手动调用方法的具体生命周期流程

1)startService()

  • 作用:启动Service服务
  • 手动调用startService()后,自动调用内部方法:onCreate()、onStartCommand()
  • 调用流程图如下:

2) stopService()

  • 作用:关闭Service服务
  • 手动调用stopService()后,自动调用内部方法:onDestory()
  • 调用的流程图如下:

3)bindService()

  • 作用:绑定Service服务
  • 手动调用bindService()后,自动调用内部方法:onCreate()、onBind()
  • 调用的逻辑: 

4)unbindService()

  • 作用:解绑Service服务
  • 手动调用unbindService()后,自动调用内部方法:onUnbind()、onDestory()
  • 调用的逻辑:

介绍一下三种调用Service的生命周期情况

1)只使用startService()启动服务的生命周期

2)只使用bindService()绑定服务的生命周期

3)同时使用startService()启动服务、bindService()绑定服务的生命周期

以上是关于Service的生命周期的主要内容,如果未能解决你的问题,请参考以下文章

android 怎么打印service生命周期

在不存在的片段上调用片段生命周期和 onCreate 的问题

Android片段生命周期:onResume调用了两次

导航上的片段生命周期重叠

Android 片段生命周期

Service的生命周期