- 純個人筆記,不結(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()));