Service基础

2021-01-27  本文已影响0人  ying1229

Service基础用法

服务(service)是一种可在后台执行长时间操作而不提供界面的应用组件,由应用的组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。服务默认运行在其托管进程的主线程中,因此如果需要在服务中执行耗时或者阻断性操作,需要使用单独的线程或者使用系统提供的IntentService。一般情况下,如果需要执行的任务只有在用户与应用交互时才需要执行,则首先应考虑使用线程,而不是服务。

服务的类型
  1. 前台服务,前台服务可以用来执行一些用户能注意到的操作,例如播放音乐,前台服务必须显示通知,即使用户停止与应用的交互,前台服务仍会继续运行。
  2. 后台服务,用来执行用户不会直接注意到的操作,例如压缩清理应用缓存。
  3. 绑定服务,当应用组件通过bindService绑定到服务时,服务即处于绑定状态,绑定服务会提供C/S接口与应用组件进行通信,一个服务可以同时被多个组件绑定,当全部取消绑定后,服务才会被销毁。
创建并使用服务

可以通过创建 Service的子类来使用服务,在子类中需要实现一些方法来处理服务的生命周期,一般情况下需要重写以下方法:

方法名 描述
onCreate 首次创建服务时,系统会(在调用 onStartCommand() 或 onBind() 之前)调用此方法来执行一次性设置程序。如果服务已在运行,则不会调用此方法。
onBind 当另一个组件想要与服务绑定(例如执行 RPC)时,系统会通过调用 bindService() 来调用此方法。在此方法的实现中,必须通过返回 IBinder 提供一个接口,以供客户端用来与服务进行通信。如果并不希望服务被绑定,可以直接返回 null。
onUnbind 所有与当前服务绑定的客户端调用了解绑方法后调用
onStartCommand 当另一个组件(如 Activity)请求启动服务时,系统会通过调用 startService() 来调用此方法。执行此方法时,服务即会启动并可在后台无限期运行。如果实现了此方法,则在服务工作完成后,需通过调用 stopSelf() 或 stopService() 来停止服务。(如果只想提供绑定,则无需实现此方法。)
onDestory 当不再使用服务且准备将其销毁时,系统会调用此方法。服务应通过实现此方法来清理任何资源,如线程、注册的侦听器、接收器等。这是服务接收的最后一个调用。

通常可以扩展以下两个类来创建启动服务

class CustomService:Service() {
    private val TAG = "CustomService"
    
    override fun onCreate() {
        Log.d(TAG, "onCreate")
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.d(TAG, "onStartCommand")
        return super.onStartCommand(intent, flags, startId)
    }

    override fun onBind(intent: Intent?): IBinder? {
        Log.d(TAG, "onBind")
        return null
    }

    override fun onDestroy() {
        Log.d(TAG, "onBind")
        super.onDestroy()
    }
}
class CustomIntentService(private val name: String) : IntentService(name) {
    private val TAG = "CustomIntentService"
    override fun onHandleIntent(intent: Intent?) {
        Log.d(TAG, "onHandleIntent")
    }
}
服务的生命周期
service_lifecycle.png

由上图可见,服务的生命周期,主要有两种情况:

上一篇 下一篇

猜你喜欢

热点阅读