JobScheduler系統(tǒng)源碼分析

  • 純個人筆記,不結(jié)合源碼,你完全可能看不懂

  • JobSchedulerService:
    系統(tǒng)服務(wù), 性質(zhì)同AMS, WMS等。
  • JobSchedulerService.mControllers:
    幾種狀態(tài)控制器,監(jiān)聽電池、屏幕、用戶變動等消息。最早從廣播觸發(fā),交由它來處理。
  • JobScheduler:
    抽象類,給接口給APP用,直接實現(xiàn)是JobSchedulerImpl。
  • JobSchedulerImpl:
    系統(tǒng)遠程服務(wù)JobSchedulerService的客戶端,給APP調(diào)用,提交、取消Job都通過它。

流程:

  • 初始化
    JobSchedulerService.onBootPhase() :
    //一開機,就初始化批處理的執(zhí)行環(huán)境
    //每個JobService的執(zhí)行狀態(tài),上下文,溝通,都在這個類JobServiceContext的實例里來處理,JobSchedulerService負責(zé)排隊機制,然后丟給它們,來具體執(zhí)行任務(wù)。當(dāng)然,這是開機時,初始化而已,還沒任務(wù)進來。
    mActiveServices.add( new JobServiceContext(this, mBatteryStats, getContext().getMainLooper()));

  • 任務(wù)添加與執(zhí)行:
    JobScheduler.schedule() --> JobSchedulerService.schedule() -->startTrackingJob() 提交任務(wù)信息給相交的處理器,

比如,空閑控制器,當(dāng)系統(tǒng)空閑時,處理任務(wù)。
IdleController.IdlenessTracker --> startTracking() ,
注冊廣播監(jiān)聽,監(jiān)聽ACTION_SCREEN_ON、ACTION_SCREEN_OFF等消息,來獲得系統(tǒng)空閑狀態(tài)。
比如,
廣播onReceive中,得到空閑狀態(tài) ACTION_TRIGGER_IDLE
--> reportNewIdleState(), 報告空閑狀態(tài),開始安排需要在空閑狀態(tài)處理的任務(wù)
--> 監(jiān)聽機制,onControllerStateChanged, 實現(xiàn)者是JobSchedulerService
--> JobSchedulerService.onControllerStateChanged --> MSG_CHECK_JOB, 發(fā)消息給自己的線程,去處理,
---> maybeQueueReadyJobsForExecutionLockedH, 任務(wù)排隊處理, 分類,丟到各類的mPendingJobs里
---> maybeRunPendingJobsH,一個個任務(wù)處理,這里涉及新的mPendingJobs與已經(jīng)提交過的,甚至放在mActiveServices里的任務(wù),進行過濾,匹配的問題。略過。
反正,最終,要執(zhí)行的任務(wù)信息,都丟進 mActiveServices
-->mActiveServices.get(i).executeRunnableJob
--> JobServiceContext.executeRunnableJob()
這是直正執(zhí)行任務(wù)的地方,通過遠程bindService的方式,來啟動JobService的實例,顯然,如果你的應(yīng)用掛了,service沒起來,它會自動創(chuàng)建起來。
這里丟進去的是this, 也就是創(chuàng)建成功,會執(zhí)行本實例的JobServiceContext.onServiceConnected。
在里面你就可以看到,會發(fā)消息去讓自己處理,最終遠程調(diào)用JobService.startJob();等,
最終下調(diào)到你的JobService.onStartJob().等。
final Intent intent = new Intent().setComponent(job.getServiceComponent());
boolean binding = mContext.bindServiceAsUser(intent, this,
Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND,
new UserHandle(job.getUserId()));

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容