【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )
文章目錄
- 一、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 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 电量优化】JobSch
- 下一篇: android sina oauth2.