Android JobSchedule机制

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

方法调用流程图:
y44

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×