美文网首页
【白水日记】JobIntentService

【白水日记】JobIntentService

作者: d2665f7588cb | 来源:发表于2021-02-24 09:52 被阅读0次

        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的流程

    相关文章

      网友评论

          本文标题:【白水日记】JobIntentService

          本文链接:https://www.haomeiwen.com/subject/cqxwxltx.html