【白水日记】JobIntentService

2021-02-24  本文已影响0人  d2665f7588cb

    JobIntentService本质也是一个Service,一看job开头的系统组件,基本就是JobScheduler系列的产品

    看文档上说明:

    O版本之前会立即执行,之后的版本可能会延迟

    O版本之前,Service可能会被系统杀死,之后不会被杀

   在AndroidO之后,JobScheduler会帮你处理好wake locks,不需要使用wakefulBroadcastReceive,在O之前的版本,需直接调用PowerManager,因此需要申请权限

<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

配置文件注册Service

<service

    android:name="java.com.chip.TestJobIntentService"

    android:exported="true"

    android:permission="android.permission.BIND_JOB_SERVICE" />

实现onHandleWork和enqueueWork方法

class TestJobIntentService :JobIntentService() {

override fun onHandleWork(intent:Intent) {

Log.d("JobIntentService","onHandleWork() called with: intent = $intent")

}

companion object {

@JvmStatic

        fun enqueueWork(ApplicationContext:Context,intent:Intent) {

enqueueWork(ApplicationContext,TestJobIntentService::class.java,11111,intent)

Log.d("JobIntentService","enqueueWork() called with: intent = $intent")

}

}

}

调用和一般Service差不多

Intent intent = new Intent(this,TestJobIntentService.class);

TestJobIntentService.enqueueWork(getApplicationContext(),intent);

    JobIntentService同样设计为不可取消的,虽然是IntentService的实现,可以使用StopService进行销毁,但可能不会对onHandleWork有效,任务执行完成之前,stopSerice()不会调用

    JobIntentService的实现比IntentService复杂一些,核心方法是enqueueWork方法,内部通过调用WorkEnqueuer实例把intent传入,根据版本不同,兼容中转处理,O之后使用JobWorkEnqueuer

O版本之前使用CompatWorkEnqueuer,CompatWorkEnqueuer内部启动一个service进行处理,构造函数维护一个CompatQueue,即ArrayList类型存储CompatWorkItem,CompatWorkItem处理O之前的版本。onCreate的时候,通过getWorkEnqueuer获取WorkEnqueuer赋值给CompatWorkEnqueuer,onStartCommand时,将intent的信息赋给CompatWorkItem,保存到CompatQueue中,最后调用ensureProcessorRunningLocked,在此处构造一个CommandProcessor,本质继承自AsyncTask,通过AsyncTask的doInBackground方法处理onHandleWork的工作。

O版本之后,getWorkEnqueuer,会构造一个JobWorkEnqueuer,调用其enqueueWork,JobWorkEnqueuer继承自WorkEnqueuer,内部调用enqueueWork方法,实际上就是调用JobScheduler的enqueue。JobIntentService初始化的时候会将CompatQueue置为空,oncreate时,初始化JobServiceEngineImpl,本质回到调用onStartJob方法,重新回到ensureProcessorRunningLocked流程,同上。

下一篇分析下WorkManager的流程

上一篇下一篇

猜你喜欢

热点阅读