【白水日记】JobIntentService
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的流程