jobScheduler 是一个提供给App 端设定一个满足条件执行的任务,从App 设定一个Job到服务端接受这个job ,到服务端管理这个job,到最终触发这个job 以及重系统中移除,整个流程整体并不太复杂,而是细节计算上有很多点比较让人烦恼,我这里大概将其流程梳理一遍:
- App 创建一个Job,并scheduler该job
- JobSchedulerImpl通过Binder调用,调用到服务端JobSchedulerService端的scheduleAsPackage
- 在添加到mJobs集合中之前先搜索系统中是否有相同的Job已经存在,如果存在则先canel掉并,再将其加入到mJobs中
- 判断该Job是否有对应的限制条件为其Job 分配对应的Controller 。
- Controllers 中所有的控制器要么是监听广播,要么是注册listener 去监听系统状态改变,当系统状态发生改变则都会去通过回调到JobSchedulerService
- onStateChanged中在发送MSG_CHECK_JOB 消息,处理对应消息,首先判断mReportedActive 是否为true
- 将ready好的Job加入到mPendingsJob列表中,然后调用到assignJobsToContextsLocked 核心方法
- 在assignJobsToContextsLocked 完成各种计算后,将mActiveService的可以运行的Job,调用executeRunnableJob 方法。
- 调用到JobServiceContext 中,开始启动服务bindService。在当服务binder上App端的JobService 服务,回调回onServiceConnected()
- 在doServiceBoundLocked() 中调用到handleServiceBoundLocked中通过service.startJob() ,继而通过BinderCall 回调到JobServiceEnginee中,发送消息MSG_EXECUTE_JOB到main线程中
- 调用到App 实现的JobService 中onStartjob中,执行App JobService 的具体事物
- App端调用JobFinish,binder call 调用到JobServiceContext ,清理该Job的一些资源和变量,并将其从mJobStore 中的删掉。
原文链接:https://blog.csdn.net/u011311586/article/details/83027820