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

歡迎訪問 生活随笔!

生活随笔

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

Android

【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )

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

文章目錄

  • 一、ConnectivityController 連接控制器引入
  • 二、ConnectivityController 構造方法解析 ( 注冊接收者 )
  • 三、mConnectivityReceiver 廣播接收者
  • 四、updateTrackedJobs 更新監控任務
  • 五、ConnectivityController 部分源碼注釋



推薦代碼查看網站 :

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

  • http://androidxref.com/



上一篇博客 【Android 電量優化】JobScheduler 源碼分析 ( JobSchedulerService 源碼分析 | Android 源碼在線網址推薦 ) 中講解了JobScheduler 調用 schedule 方法底層調用 :

  • 該方法最終調用的是 JobSchedulerService 中的 int schedule(JobInfo job, int uId) 方法
  • 在 schedule 方法中調用了 scheduleAsPackage 方法
  • 在 scheduleAsPackage 方法中調用了 startTrackingJob 方法
  • 在 startTrackingJob 中 , 調用了每個 StateController 狀態控制器的 maybeStartTrackingJobLocked 的方法 ;

本篇博客中講解了 ConnectivityController 中對任務狀態的處理 ;





一、ConnectivityController 連接控制器引入



上一篇博客中在 JobSchedulerService 中最終在 startTrackingJob 方法中 , 調用了 StateController 控制器的 maybeStartTrackingJobLocked 方法 ;

這里以 ConnectivityController 連接控制器為例 , 該類是 StateController 的子類 , 其在 JobSchedulerService 中相關源碼如下 :

/** 控制器集合 , 提醒該 Service 服務區更新任務. */List<StateController> mControllers;// 后續會遍歷該集合 , 遍歷出的元素會調用 maybeStartTrackingJobLocked 方法mControllers = new ArrayList<StateController>();// 網絡控制器mControllers.add(ConnectivityController.get(this));// 調用控制器的 maybeStartTrackingJobLocked 函數 controller.maybeStartTrackingJobLocked(jobStatus, lastJob);

ConnectivityController 中的 void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) 方法 , 該方法作用是更新所有該控制器追蹤的任務 , 被追蹤的任務都在 ArrayList<JobStatus> mTrackedJobs 集合中 , 該集合在類成員變量中維護 ;

會對傳入的任務狀態 JobStatus jobStatus 參數進行一系列判定 , 如果判定通過 , 就會執行





二、ConnectivityController 構造方法解析 ( 注冊接收者 )



ConnectivityController(StateChangedListener stateChangedListener, Context context, Object lock) 構造方法中 , 注冊了廣播接收者 , 接收 ConnectivityManager.CONNECTIVITY_ACTION 廣播 , 這是監聽網絡狀態改變發出的廣播 ;

// 注冊廣播接收者 , 接收 ConnectivityManager.CONNECTIVITY_ACTION 廣播 , 這是監聽網絡狀態改變發出的廣播final IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);mContext.registerReceiverAsUser(mConnectivityReceiver, UserHandle.SYSTEM, intentFilter, null, null);



三、mConnectivityReceiver 廣播接收者



在 mConnectivityReceiver 廣播接收者中 , 接收到 ConnectivityManager.CONNECTIVITY_ACTION 廣播 , 網絡狀態改變后 , 就會調 updateTrackedJobs(-1) 函數 ;

public void onReceive(Context context, Intent intent) {// 接收到 ConnectivityManager.CONNECTIVITY_ACTION 廣播// 網絡狀態改變后 , 就會調用該函數 updateTrackedJobs(-1);}



四、updateTrackedJobs 更新監控任務



void updateTrackedJobs(int uid) 方法的作用是 : 更新所有該控制器追蹤的任務 , 被追蹤的任務都在 ArrayList mTrackedJobs 集合中 ;

int uid 參數含義 : 更新該 uid 對應的任務 , 如果傳入 -1 那么就是更新所有的被追蹤任務 ;


在該方法中 , 遍歷所有的被監聽的任務集合 , ArrayList mTrackedJobs , 如果有一個任務發生改變 , 就回調 狀態改變監聽器 mStateChangedListener , 該 mStateChangedListener 定義在父類 StateController 中 ; mStateChangedListener 實際上是 JobSchedulerService ;

mStateChangedListener.onControllerStateChanged();



五、ConnectivityController 部分源碼注釋



/*** 處理連接狀態改變* 每個應用可以有不同的默認網絡或不同的連接狀態 , 根據用戶需要的網絡策略 , 因此我們需要檢查每個 uid 要素的約束 .*/ public class ConnectivityController extends StateController implementsConnectivityManager.OnNetworkActiveListener {// 連接管理器系統服務private final ConnectivityManager mConnManager;// 網絡策略管理器系統服務private final NetworkPolicyManager mNetPolicyManager;// 任務狀態集合@GuardedBy("mLock")private final ArrayList<JobStatus> mTrackedJobs = new ArrayList<JobStatus>();// 連接控制器構造函數 private ConnectivityController(StateChangedListener stateChangedListener, Context context,Object lock) {// 調用父類的 StateController 的構造方法super(stateChangedListener, context, lock);// 獲取連接管理器系統服務mConnManager = mContext.getSystemService(ConnectivityManager.class);// 獲取網絡策略系統服務 mNetPolicyManager = mContext.getSystemService(NetworkPolicyManager.class);// 注冊廣播接收者 , 接收 ConnectivityManager.CONNECTIVITY_ACTION 廣播 , 這是監聽網絡狀態改變發出的廣播final IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);mContext.registerReceiverAsUser(mConnectivityReceiver, UserHandle.SYSTEM, intentFilter, null, null);// 注冊網絡策略監聽器mNetPolicyManager.registerListener(mNetPolicyListener);}@Overridepublic void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) {// 判斷任務的一系列狀態if (jobStatus.hasConnectivityConstraint() || jobStatus.hasUnmeteredConstraint()|| jobStatus.hasNotRoamingConstraint()) {updateConstraintsSatisfied(jobStatus);// 將任務狀態放入 ArrayList<JobStatus> mTrackedJobs 集合中mTrackedJobs.add(jobStatus);}}// 在構造函數中注冊的廣播接收者 private BroadcastReceiver mConnectivityReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {// 接收到 ConnectivityManager.CONNECTIVITY_ACTION 廣播// 網絡狀態改變后 , 就會調用該函數 updateTrackedJobs(-1);}};/*** 更新所有該控制器追蹤的任務 ;* 被追蹤的任務都在 ArrayList<JobStatus> mTrackedJobs 集合中** @param uid 更新該 uid 對應的任務 , 如果傳入 -1 那么就是更新所有的被追蹤任務*/private void updateTrackedJobs(int uid) {synchronized (mLock) {boolean changed = false;// 遍歷所有的被監聽的任務集合 , ArrayList<JobStatus> mTrackedJobs for (int i = 0; i < mTrackedJobs.size(); i++) {final JobStatus js = mTrackedJobs.get(i);if (uid == -1 || uid == js.getSourceUid()) {changed |= updateConstraintsSatisfied(js);}}// 如果判斷的改變為 true , 就回調 狀態改變監聽器 mStateChangedListener// 該 mStateChangedListener 定義在父類 StateController 中 // 狀態控制器創建時 , 會傳入 mStateChangedListener if (changed) {mStateChangedListener.onControllerStateChanged();}}} }

該代碼路徑為 frameworks/base/services/core/java/com/android/server/job/controllers/ConnectivityController.java , 點擊鏈接可跳轉查看完整源碼 ;

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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