【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★
文章目錄
- 一、JobServiceContext 引入
- 二、JobServiceContext 源碼分析
- 三、用戶(hù)在應(yīng)用層如何使用 JobScheduler
- 四、用戶(hù)提交任務(wù)
- 五、廣播接收者監(jiān)聽(tīng)廣播觸發(fā) JobService 執(zhí)行任務(wù)
推薦代碼查看網(wǎng)站 :
-
https://www.androidos.net.cn/sourcecode ( 推薦 )
-
http://androidxref.com/
一、JobServiceContext 引入
上一篇博客 【Android 電量?jī)?yōu)化】JobScheduler 相關(guān)源碼分析 ( JobSchedulerService 源碼分析 | 任務(wù)檢查 | 任務(wù)執(zhí)行 ) 中在 JobSchedulerService 中的 assignJobsToContextsLocked 方法中 , 有如下代碼 :
// /frameworks/base/services/core/java/com/android/server/job/JobSchedulerService.java 中的代碼 mActiveServices.get(i).executeRunnableJob(pendingJob)mActiveServices 就是 JobServiceContext 集合 , 上述方法調(diào)用了 JobServiceContext 的 executeRunnableJob 方法 , 目的是要執(zhí)行傳入的 pendingJob 任務(wù) ;
二、JobServiceContext 源碼分析
在 JobServiceContext 類(lèi)的 executeRunnableJob 方法的作用 : 該方法傳遞一個(gè) Job 任務(wù)給 JobServiceContext 執(zhí)行 , 調(diào)用者需要先檢查如下兩個(gè)條件 :
- 當(dāng)前是否有運(yùn)行中的任務(wù) , getRunningJob() 必須為空 ;
- 同時(shí)還需要確保該 JobServiceContext 上下文是有效的 ;
在該方法中創(chuàng)建了 Intent , 并使用該意圖綁定了一個(gè)服務(wù) , 這個(gè)服務(wù)就是創(chuàng)建 JobInfo 時(shí) , 開(kāi)發(fā)者自定義的 JobService 服務(wù) , 提交任務(wù)時(shí)需要提交該服務(wù) ;
綁定服務(wù) , 執(zhí)行 JobService 服務(wù)中的 onStartJob 方法
截止到此處 , 基本 JobScheduler 整個(gè)運(yùn)行的閉環(huán) , 進(jìn)行了簡(jiǎn)單的源碼分析 , 沒(méi)有深入分析 , 僅限于簡(jiǎn)單了解 ;
public class JobServiceContext extends IJobCallback.Stub implements ServiceConnection {// ... /*** 該方法傳遞一個(gè) Job 任務(wù)給 JobServiceContext 執(zhí)行 . * 調(diào)用者需要先檢查當(dāng)前是否有運(yùn)行中的任務(wù) , getRunningJob() 為空 ; * 并且確保該 JobServiceContext 上下文是有效的 ; * * @param 將要運(yùn)行的任務(wù)的狀態(tài) ;* @return True 如果該任務(wù)是有效的 , 并且正在執(zhí)行 ; * False 如果該任務(wù)不能被執(zhí)行 ; */boolean executeRunnableJob(JobStatus job) {synchronized (mLock) {// ...// 此處創(chuàng)建了 Intent , 并使用該意圖綁定了一個(gè)服務(wù) final Intent intent = new Intent().setComponent(job.getServiceComponent());// 使用上述意圖 Intent 綁定服務(wù) // 這個(gè)服務(wù)就是創(chuàng)建 JobInfo 時(shí) , 開(kāi)發(fā)者自定義的 JobService 服務(wù) , 提交任務(wù)時(shí)需要提交該服務(wù) boolean binding = mContext.bindServiceAsUser(intent, this,Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND,new UserHandle(job.getUserId()));// ... try {// 啟動(dòng)服務(wù) , 會(huì)執(zhí)行 JobService 服務(wù)中的 onStartJob 方法mBatteryStats.noteJobStart(job.getBatteryName(), job.getSourceUid());} catch (RemoteException e) {// Whatever.}mJobPackageTracker.noteActive(job);mAvailable = false;return true;}}}該代碼路徑為 /frameworks/base/services/core/java/com/android/server/job/JobServiceContext.java , 點(diǎn)擊鏈接可跳轉(zhuǎn)查看完整源碼 ;
三、用戶(hù)在應(yīng)用層如何使用 JobScheduler
先講解用戶(hù)在應(yīng)用層如何使用 JobScheduler :
在 【Android 電量?jī)?yōu)化】電量?jī)?yōu)化 ( JobScheduler | JobService | AsyncTask ) 博客中 , 講解了 JobScheduler 如何使用 ;
- 獲取服務(wù) : 首先獲取系統(tǒng)的 JobScheduler 服務(wù) , 就是之前分析的 JobSchedulerService 類(lèi) ;
- 創(chuàng)建任務(wù) : 創(chuàng)建 JobInfo 任務(wù)信息 , 使用 JobScheduler 提交該任務(wù) ; mJobScheduler.schedule(jobInfo) ;
- 自定義 JobService : 開(kāi)發(fā)者在應(yīng)用中自定義 JobService 服務(wù) ;
- 服務(wù)執(zhí)行 : 系統(tǒng)會(huì)在合適的時(shí)間調(diào)用 JobService 服務(wù)的 boolean onStartJob(JobParameters params) 方法 ;
其中涉及到兩個(gè)入口 , 一個(gè)是用戶(hù)提交任務(wù) , 另一個(gè)是系統(tǒng)在某個(gè)時(shí)間回調(diào) JobService 服務(wù)中的開(kāi)始執(zhí)行任務(wù)方法 ;
主要針對(duì)上述兩個(gè)入口進(jìn)行分析 ;
用戶(hù)提交任務(wù)的驅(qū)動(dòng)事件是開(kāi)發(fā)者寫(xiě)的提交任務(wù)的代碼 ;
系統(tǒng)回調(diào) JobService 服務(wù)的驅(qū)動(dòng)事件 , 是用戶(hù)對(duì)手機(jī)的操作 , 如插拔電源線(xiàn) , 切換 WIFI 網(wǎng)絡(luò)等操作 , 這些操作觸發(fā)廣播 , 相應(yīng)廣播接收者收到這些廣播 , 就會(huì)觸發(fā)一系列相關(guān)的操作 ;
四、用戶(hù)提交任務(wù)
分析用戶(hù)提交任務(wù) :
【Android 電量?jī)?yōu)化】JobScheduler 相關(guān)源碼分析 ( JobSchedulerService 源碼分析 | Android 源碼在線(xiàn)網(wǎng)址推薦 ) 博客中講解了如下內(nèi)容 :
- JobScheduler 提交任務(wù)的方法 schedule(jobInfo) , 最終調(diào)用的是 JobSchedulerService 中的 schedule 方法 ;
- 在 schedule 方法中調(diào)用了 scheduleAsPackage 方法 , 傳入任務(wù)相關(guān)信息 , 進(jìn)行了一系列的狀態(tài)判定 ;
- 在 scheduleAsPackage 方法中調(diào)用 startTrackingJob 方法 , 該方法中遍歷所有的狀態(tài)控制器 , 確保所有相關(guān)的控制器知道該狀態(tài) ;
【Android 電量?jī)?yōu)化】JobScheduler 相關(guān)源碼分析 ( ConnectivityController 底層源碼分析 | 構(gòu)造函數(shù) | 追蹤任務(wù)更新 | 注冊(cè)接收者監(jiān)聽(tīng)連接變化 ) 博客中接著上面的博客繼續(xù)分析 :
- 在 startTrackingJob() 方法中 , 調(diào)用狀態(tài)控制器 StateController 的 maybeStartTrackingJobLocked 方法 , 該方法的作用是更新所有對(duì)應(yīng)的狀態(tài)控制器監(jiān)聽(tīng)的任務(wù) ;
五、廣播接收者監(jiān)聽(tīng)廣播觸發(fā) JobService 執(zhí)行任務(wù)
廣播接收者監(jiān)聽(tīng)廣播 : 這是觸發(fā)系統(tǒng)回調(diào) JobService 服務(wù)的入口 ;
在 【Android 電量?jī)?yōu)化】JobScheduler 相關(guān)源碼分析 ( ConnectivityController 底層源碼分析 | 構(gòu)造函數(shù) | 追蹤任務(wù)更新 | 注冊(cè)接收者監(jiān)聽(tīng)連接變化 ) 博客中分析到
- 注冊(cè)廣播接收者 : ConnectivityController 中注冊(cè)了廣播接收者 , 用于監(jiān)聽(tīng) ConnectivityManager.CONNECTIVITY_ACTION 廣播 , 這是網(wǎng)絡(luò)狀態(tài)改變后發(fā)出的廣播 ;
- 廣播接收者收到網(wǎng)絡(luò)狀態(tài)改變的廣播后 , 會(huì)調(diào)用 updateTrackedJobs(-1) 方法 ;
- 該方法會(huì)更新所有對(duì)網(wǎng)絡(luò)狀態(tài)敏感的任務(wù) , 例如有的任務(wù)要求在 WIFI 條件下執(zhí)行 , 此時(shí)就會(huì)觸發(fā)該任務(wù)的狀態(tài)改變 ;
- updateTrackedJobs 方法中又會(huì)調(diào)用 狀態(tài)改變監(jiān)聽(tīng)器 mStateChangedListener 的 onControllerStateChanged 方法 ;
- 狀態(tài)改變監(jiān)聽(tīng)器 mStateChangedListener 就是 JobSchedulerService 類(lèi) ;
【Android 電量?jī)?yōu)化】JobScheduler 相關(guān)源碼分析 ( JobSchedulerService 源碼分析 | 任務(wù)檢查 | 任務(wù)執(zhí)行 ) 博客中講解后續(xù)操作 :
- 在實(shí)現(xiàn)的 StateChangedListener 接口的 onControllerStateChanged() 回調(diào)方法中 , 使用 JobHandler mHandler 發(fā)送了 MSG_CHECK_JOB 消息 ;
- 在 JobHandler 中接收上述消息 , 并檢查任務(wù) , 最終調(diào)用 maybeRunPendingJobsH() 方法 , 執(zhí)行任務(wù) ;
- 在 maybeRunPendingJobsH 方法中 , 調(diào)用 assignJobsToContextsLocked , 執(zhí)行任務(wù) ;
- 在 assignJobsToContextsLocked 方法中 , 最終調(diào)用了 JobServiceContext 執(zhí)行 executeRunnableJob(pendingJob) 方法 , 用于執(zhí)行 pendingJob 任務(wù) ;
- 最終在 JobServiceContext 中綁定用戶(hù)自定義的 JobService , 開(kāi)始執(zhí)行任務(wù) , 會(huì)自動(dòng)回調(diào)下面代碼中的 onStartJob 方法 ;
本篇博客涉及到的源碼 :
- /frameworks/base/services/core/java/com/android/server/job/JobSchedulerService.java
- frameworks/base/services/core/java/com/android/server/job/controllers/ConnectivityController.java
- /frameworks/base/services/core/java/com/android/server/job/JobServiceContext.java
總結(jié)
以上是生活随笔為你收集整理的【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Android 电量优化】JobSch
- 下一篇: 【Android】Source Insi