日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★

發布時間:2025/6/17 Android 34 豆豆

文章目錄

  • 一、JobServiceContext 引入
  • 二、JobServiceContext 源碼分析
  • 三、用戶在應用層如何使用 JobScheduler
  • 四、用戶提交任務
  • 五、廣播接收者監聽廣播觸發 JobService 執行任務



推薦代碼查看網站 :

  • https://www.androidos.net.cn/sourcecode ( 推薦 )

  • http://androidxref.com/





一、JobServiceContext 引入



上一篇博客 【Android 電量優化】JobScheduler 相關源碼分析 ( JobSchedulerService 源碼分析 | 任務檢查 | 任務執行 ) 中在 JobSchedulerService 中的 assignJobsToContextsLocked 方法中 , 有如下代碼 :

// /frameworks/base/services/core/java/com/android/server/job/JobSchedulerService.java 中的代碼 mActiveServices.get(i).executeRunnableJob(pendingJob)

mActiveServices 就是 JobServiceContext 集合 , 上述方法調用了 JobServiceContext 的 executeRunnableJob 方法 , 目的是要執行傳入的 pendingJob 任務 ;





二、JobServiceContext 源碼分析



在 JobServiceContext 類的 executeRunnableJob 方法的作用 : 該方法傳遞一個 Job 任務給 JobServiceContext 執行 , 調用者需要先檢查如下兩個條件 :

  • 當前是否有運行中的任務 , getRunningJob() 必須為空 ;
  • 同時還需要確保該 JobServiceContext 上下文是有效的 ;

在該方法中創建了 Intent , 并使用該意圖綁定了一個服務 , 這個服務就是創建 JobInfo 時 , 開發者自定義的 JobService 服務 , 提交任務時需要提交該服務 ;

綁定服務 , 執行 JobService 服務中的 onStartJob 方法


截止到此處 , 基本 JobScheduler 整個運行的閉環 , 進行了簡單的源碼分析 , 沒有深入分析 , 僅限于簡單了解 ;

public class JobServiceContext extends IJobCallback.Stub implements ServiceConnection {// ... /*** 該方法傳遞一個 Job 任務給 JobServiceContext 執行 . * 調用者需要先檢查當前是否有運行中的任務 , getRunningJob() 為空 ; * 并且確保該 JobServiceContext 上下文是有效的 ; * * @param 將要運行的任務的狀態 ;* @return True 如果該任務是有效的 , 并且正在執行 ; * False 如果該任務不能被執行 ; */boolean executeRunnableJob(JobStatus job) {synchronized (mLock) {// ...// 此處創建了 Intent , 并使用該意圖綁定了一個服務 final Intent intent = new Intent().setComponent(job.getServiceComponent());// 使用上述意圖 Intent 綁定服務 // 這個服務就是創建 JobInfo 時 , 開發者自定義的 JobService 服務 , 提交任務時需要提交該服務 boolean binding = mContext.bindServiceAsUser(intent, this,Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND,new UserHandle(job.getUserId()));// ... try {// 啟動服務 , 會執行 JobService 服務中的 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 , 點擊鏈接可跳轉查看完整源碼 ;





三、用戶在應用層如何使用 JobScheduler



先講解用戶在應用層如何使用 JobScheduler :


在 【Android 電量優化】電量優化 ( JobScheduler | JobService | AsyncTask ) 博客中 , 講解了 JobScheduler 如何使用 ;

  • 獲取服務 : 首先獲取系統的 JobScheduler 服務 , 就是之前分析的 JobSchedulerService 類 ;
  • 創建任務 : 創建 JobInfo 任務信息 , 使用 JobScheduler 提交該任務 ; mJobScheduler.schedule(jobInfo) ;
  • 自定義 JobService : 開發者在應用中自定義 JobService 服務 ;
  • 服務執行 : 系統會在合適的時間調用 JobService 服務的 boolean onStartJob(JobParameters params) 方法 ;

其中涉及到兩個入口 , 一個是用戶提交任務 , 另一個是系統在某個時間回調 JobService 服務中的開始執行任務方法 ;

主要針對上述兩個入口進行分析 ;

用戶提交任務的驅動事件是開發者寫的提交任務的代碼 ;

系統回調 JobService 服務的驅動事件 , 是用戶對手機的操作 , 如插拔電源線 , 切換 WIFI 網絡等操作 , 這些操作觸發廣播 , 相應廣播接收者收到這些廣播 , 就會觸發一系列相關的操作 ;





四、用戶提交任務



分析用戶提交任務 :


【Android 電量優化】JobScheduler 相關源碼分析 ( JobSchedulerService 源碼分析 | Android 源碼在線網址推薦 ) 博客中講解了如下內容 :

  • JobScheduler 提交任務的方法 schedule(jobInfo) , 最終調用的是 JobSchedulerService 中的 schedule 方法 ;
  • schedule 方法中調用了 scheduleAsPackage 方法 , 傳入任務相關信息 , 進行了一系列的狀態判定 ;
  • scheduleAsPackage 方法中調用 startTrackingJob 方法 , 該方法中遍歷所有的狀態控制器 , 確保所有相關的控制器知道該狀態 ;

【Android 電量優化】JobScheduler 相關源碼分析 ( ConnectivityController 底層源碼分析 | 構造函數 | 追蹤任務更新 | 注冊接收者監聽連接變化 ) 博客中接著上面的博客繼續分析 :

  • startTrackingJob() 方法中 , 調用狀態控制器 StateControllermaybeStartTrackingJobLocked 方法 , 該方法的作用是更新所有對應的狀態控制器監聽的任務 ;




五、廣播接收者監聽廣播觸發 JobService 執行任務



廣播接收者監聽廣播 : 這是觸發系統回調 JobService 服務的入口 ;


在 【Android 電量優化】JobScheduler 相關源碼分析 ( ConnectivityController 底層源碼分析 | 構造函數 | 追蹤任務更新 | 注冊接收者監聽連接變化 ) 博客中分析到

  • 注冊廣播接收者 : ConnectivityController 中注冊了廣播接收者 , 用于監聽 ConnectivityManager.CONNECTIVITY_ACTION 廣播 , 這是網絡狀態改變后發出的廣播 ;
  • 廣播接收者收到網絡狀態改變的廣播后 , 會調用 updateTrackedJobs(-1) 方法 ;
  • 該方法會更新所有對網絡狀態敏感的任務 , 例如有的任務要求在 WIFI 條件下執行 , 此時就會觸發該任務的狀態改變 ;
  • updateTrackedJobs 方法中又會調用 狀態改變監聽器 mStateChangedListeneronControllerStateChanged 方法 ;
  • 狀態改變監聽器 mStateChangedListener 就是 JobSchedulerService 類 ;

【Android 電量優化】JobScheduler 相關源碼分析 ( JobSchedulerService 源碼分析 | 任務檢查 | 任務執行 ) 博客中講解后續操作 :

  • 在實現的 StateChangedListener 接口的 onControllerStateChanged() 回調方法中 , 使用 JobHandler mHandler 發送了 MSG_CHECK_JOB 消息 ;
  • JobHandler 中接收上述消息 , 并檢查任務 , 最終調用 maybeRunPendingJobsH() 方法 , 執行任務 ;
  • maybeRunPendingJobsH 方法中 , 調用 assignJobsToContextsLocked , 執行任務 ;
  • assignJobsToContextsLocked 方法中 , 最終調用了 JobServiceContext 執行 executeRunnableJob(pendingJob) 方法 , 用于執行 pendingJob 任務 ;
  • 最終在 JobServiceContext 中綁定用戶自定義的 JobService , 開始執行任務 , 會自動回調下面代碼中的 onStartJob 方法 ;
public class BpJobService extends JobService {@Overridepublic boolean onStartJob(JobParameters params) {// 啟動 AsyncTask 異步任務處理工作new JobAsyncTask().execute(params);return false;}// ... 省略部分代碼 }

本篇博客涉及到的源碼 :

  • /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

總結

以上是生活随笔為你收集整理的【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。