JobScheduler 主要用於在未來某個時間下滿足壹定條件時觸發執行某項任務的情況,涉及的條件可以是網絡、電量、時間等,例如執行特定的網絡、是否只在充電時執行任務等。
JobScheduler類負責將應用需要執行的任務發送給框架,以備對該應用Job的調度,是壹個系統服務,可以通過如下方式獲取:
JobInfo是傳遞給JobScheduler類的數據容器,它封裝了針對調用應用程序調度任務所需的各種約束,也可以認為壹個JobInfo對象對應壹個任務,JobInfo對象通過JobInfo.Builder創建。它將作為參數傳遞給JobScheduler:
JobInfo.Builder是JobInfo的壹個內部類,用來創建JobInfo的Builder類。
JobService是JobScheduler最終回調的端點,JobScheduler將會回調該類中的onStartJob()開始執行異步任務。它是壹個繼承於JobService的抽象類,做為系統回調執行任務內容的終端,JobScheduler框架將通過bindService()方式來啟動該服務。因此,用戶必須在應用程序中創建壹個JobService的子類,並實現其onStartJob()等回調方法,以及在AndroidManifest.xml中對它授予如下權限:
註意在AndroidManifest.xml中添加權限
當任務開始時會執行onStartJob(JobParameters params)方法,如果返回值是false,則系統認為這個方法返回時,任務已經執行完畢。如果返回值是true,那麽系統認為這個任務正要被執行,執行任務的重擔就落在了妳的肩上。當任務執行完畢時妳需要調用jobFinished(JobParameters params, boolean needsRescheduled)來通知系統。
當系統接收到壹個取消請求時,系統會調用onStopJob(JobParameters params)方法取消正在等待執行的任務。很重要的壹點是如果onStartJob(JobParameters params)返回false,那麽系統假定在接收到壹個取消請求時已經沒有正在運行的任務。換句話說,onStopJob(JobParameters params)在這種情況下不會被調用。
需要註意的是這個Job Service運行在主線程,這意味著妳需要使用子線程,handler,或者壹個異步任務來運行耗時的操作以防止阻塞主線程。
Google官方的Sample: /googlearchive/android-JobScheduler
JobScheduler是壹個抽象類,它在系統框架的實現類是android.app.JobSchedulerImpl
執行的入口是JobScheduler.scheduler,其實是調了JobSchedulerImpl中的schedule方法;然後再調了mBinder.schedule(job)。這個mBinder就是JobSchedulerService,通過Binder跨進程調用JobSchedulerService。
最後調用到JobSchedulerService中的schedule方法:
接著發送MSG_CHECK_JOB消息,消息處理的地方是
接著執行JobHandler中的 maybeRunPendingJobsH 方法,處理相應的任務
availableContext是JobServiceContext,即ServiceConnection,這個是進程間通訊ServiceConnection,通過調用availableContext.executeRunnableJob(nextPending)方法,會觸發調用onServiceConnected,看到這裏應該明白了,onServiceConnected方法中的service就是Jobservice,裏面還用了WakeLock鎖,防止手機休眠。
接著,通過Handler發消息,調用了handleServiceBoundH()方法。
從上面源碼可以看出,最終是觸發調用了JobService中的startJob方法。
從源碼看,設置的內容應用於 JobStatus ,例如網絡限制
而在JobSchedulerService類,相關的狀態控制在其構造函數裏:
例如網絡控制類ConnectivityController類
當網絡發生改變時,會調用updateTrackedJobs(userid)方法,在updateTrackedJobs方法中,會判斷網絡是否有改變,有改變的會調mStateChangedListener.onControllerStateChanged()方法;然後調用了JobSchedulerService類中onControllerStateChanged方法:
接著也是處理MSG_CHECK_JOB 消息,和上文壹樣,最終觸發調用了JobService中的startJob方法。
JobSchedulerService是壹個系統服務,即應該在SystemServer啟動的。閱讀SystemServer的源碼:
run 方法如下:
接著看 startOtherServices()
因此,在這裏就啟動了JobSchedulerService服務。
1. android 性能優化JobScheduler使用及源碼分析
2. Android 9.0 JobScheduler(壹) JobScheduler的使用
3. Android 9.0 JobScheduler(二) JobScheduler框架結構簡述及JobSchedulerService的啟動
4. Android 9.0 JobScheduler(三) 從Job的創建到執行
5. Android 9.0 JobScheduler(四) Job約束條件的控制
6. 理解JobScheduler機制