【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )
文章目錄
- 一、ConnectivityController 連接控制器引入
- 二、ConnectivityController 構(gòu)造方法解析 ( 注冊(cè)接收者 )
- 三、mConnectivityReceiver 廣播接收者
- 四、updateTrackedJobs 更新監(jiān)控任務(wù)
- 五、ConnectivityController 部分源碼注釋
推薦代碼查看網(wǎng)站 :
-
https://www.androidos.net.cn/sourcecode ( 推薦 )
-
http://androidxref.com/
上一篇博客 【Android 電量?jī)?yōu)化】JobScheduler 源碼分析 ( JobSchedulerService 源碼分析 | Android 源碼在線網(wǎng)址推薦 ) 中講解了JobScheduler 調(diào)用 schedule 方法底層調(diào)用 :
- 該方法最終調(diào)用的是 JobSchedulerService 中的 int schedule(JobInfo job, int uId) 方法
- 在 schedule 方法中調(diào)用了 scheduleAsPackage 方法
- 在 scheduleAsPackage 方法中調(diào)用了 startTrackingJob 方法
- 在 startTrackingJob 中 , 調(diào)用了每個(gè) StateController 狀態(tài)控制器的 maybeStartTrackingJobLocked 的方法 ;
本篇博客中講解了 ConnectivityController 中對(duì)任務(wù)狀態(tài)的處理 ;
一、ConnectivityController 連接控制器引入
上一篇博客中在 JobSchedulerService 中最終在 startTrackingJob 方法中 , 調(diào)用了 StateController 控制器的 maybeStartTrackingJobLocked 方法 ;
這里以 ConnectivityController 連接控制器為例 , 該類(lèi)是 StateController 的子類(lèi) , 其在 JobSchedulerService 中相關(guān)源碼如下 :
/** 控制器集合 , 提醒該 Service 服務(wù)區(qū)更新任務(wù). */List<StateController> mControllers;// 后續(xù)會(huì)遍歷該集合 , 遍歷出的元素會(huì)調(diào)用 maybeStartTrackingJobLocked 方法mControllers = new ArrayList<StateController>();// 網(wǎng)絡(luò)控制器mControllers.add(ConnectivityController.get(this));// 調(diào)用控制器的 maybeStartTrackingJobLocked 函數(shù) controller.maybeStartTrackingJobLocked(jobStatus, lastJob);在 ConnectivityController 中的 void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) 方法 , 該方法作用是更新所有該控制器追蹤的任務(wù) , 被追蹤的任務(wù)都在 ArrayList<JobStatus> mTrackedJobs 集合中 , 該集合在類(lèi)成員變量中維護(hù) ;
會(huì)對(duì)傳入的任務(wù)狀態(tài) JobStatus jobStatus 參數(shù)進(jìn)行一系列判定 , 如果判定通過(guò) , 就會(huì)執(zhí)行
二、ConnectivityController 構(gòu)造方法解析 ( 注冊(cè)接收者 )
在 ConnectivityController(StateChangedListener stateChangedListener, Context context, Object lock) 構(gòu)造方法中 , 注冊(cè)了廣播接收者 , 接收 ConnectivityManager.CONNECTIVITY_ACTION 廣播 , 這是監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)改變發(fā)出的廣播 ;
// 注冊(cè)廣播接收者 , 接收 ConnectivityManager.CONNECTIVITY_ACTION 廣播 , 這是監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)改變發(fā)出的廣播final IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);mContext.registerReceiverAsUser(mConnectivityReceiver, UserHandle.SYSTEM, intentFilter, null, null);三、mConnectivityReceiver 廣播接收者
在 mConnectivityReceiver 廣播接收者中 , 接收到 ConnectivityManager.CONNECTIVITY_ACTION 廣播 , 網(wǎng)絡(luò)狀態(tài)改變后 , 就會(huì)調(diào) updateTrackedJobs(-1) 函數(shù) ;
public void onReceive(Context context, Intent intent) {// 接收到 ConnectivityManager.CONNECTIVITY_ACTION 廣播// 網(wǎng)絡(luò)狀態(tài)改變后 , 就會(huì)調(diào)用該函數(shù) updateTrackedJobs(-1);}四、updateTrackedJobs 更新監(jiān)控任務(wù)
void updateTrackedJobs(int uid) 方法的作用是 : 更新所有該控制器追蹤的任務(wù) , 被追蹤的任務(wù)都在 ArrayList mTrackedJobs 集合中 ;
int uid 參數(shù)含義 : 更新該 uid 對(duì)應(yīng)的任務(wù) , 如果傳入 -1 那么就是更新所有的被追蹤任務(wù) ;
在該方法中 , 遍歷所有的被監(jiān)聽(tīng)的任務(wù)集合 , ArrayList mTrackedJobs , 如果有一個(gè)任務(wù)發(fā)生改變 , 就回調(diào) 狀態(tài)改變監(jiān)聽(tīng)器 mStateChangedListener , 該 mStateChangedListener 定義在父類(lèi) StateController 中 ; mStateChangedListener 實(shí)際上是 JobSchedulerService ;
mStateChangedListener.onControllerStateChanged();五、ConnectivityController 部分源碼注釋
/*** 處理連接狀態(tài)改變* 每個(gè)應(yīng)用可以有不同的默認(rèn)網(wǎng)絡(luò)或不同的連接狀態(tài) , 根據(jù)用戶需要的網(wǎng)絡(luò)策略 , 因此我們需要檢查每個(gè) uid 要素的約束 .*/ public class ConnectivityController extends StateController implementsConnectivityManager.OnNetworkActiveListener {// 連接管理器系統(tǒng)服務(wù)private final ConnectivityManager mConnManager;// 網(wǎng)絡(luò)策略管理器系統(tǒng)服務(wù)private final NetworkPolicyManager mNetPolicyManager;// 任務(wù)狀態(tài)集合@GuardedBy("mLock")private final ArrayList<JobStatus> mTrackedJobs = new ArrayList<JobStatus>();// 連接控制器構(gòu)造函數(shù) private ConnectivityController(StateChangedListener stateChangedListener, Context context,Object lock) {// 調(diào)用父類(lèi)的 StateController 的構(gòu)造方法super(stateChangedListener, context, lock);// 獲取連接管理器系統(tǒng)服務(wù)mConnManager = mContext.getSystemService(ConnectivityManager.class);// 獲取網(wǎng)絡(luò)策略系統(tǒng)服務(wù) mNetPolicyManager = mContext.getSystemService(NetworkPolicyManager.class);// 注冊(cè)廣播接收者 , 接收 ConnectivityManager.CONNECTIVITY_ACTION 廣播 , 這是監(jiān)聽(tīng)網(wǎng)絡(luò)狀態(tài)改變發(fā)出的廣播final IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);mContext.registerReceiverAsUser(mConnectivityReceiver, UserHandle.SYSTEM, intentFilter, null, null);// 注冊(cè)網(wǎng)絡(luò)策略監(jiān)聽(tīng)器mNetPolicyManager.registerListener(mNetPolicyListener);}@Overridepublic void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob) {// 判斷任務(wù)的一系列狀態(tài)if (jobStatus.hasConnectivityConstraint() || jobStatus.hasUnmeteredConstraint()|| jobStatus.hasNotRoamingConstraint()) {updateConstraintsSatisfied(jobStatus);// 將任務(wù)狀態(tài)放入 ArrayList<JobStatus> mTrackedJobs 集合中mTrackedJobs.add(jobStatus);}}// 在構(gòu)造函數(shù)中注冊(cè)的廣播接收者 private BroadcastReceiver mConnectivityReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {// 接收到 ConnectivityManager.CONNECTIVITY_ACTION 廣播// 網(wǎng)絡(luò)狀態(tài)改變后 , 就會(huì)調(diào)用該函數(shù) updateTrackedJobs(-1);}};/*** 更新所有該控制器追蹤的任務(wù) ;* 被追蹤的任務(wù)都在 ArrayList<JobStatus> mTrackedJobs 集合中** @param uid 更新該 uid 對(duì)應(yīng)的任務(wù) , 如果傳入 -1 那么就是更新所有的被追蹤任務(wù)*/private void updateTrackedJobs(int uid) {synchronized (mLock) {boolean changed = false;// 遍歷所有的被監(jiān)聽(tīng)的任務(wù)集合 , 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);}}// 如果判斷的改變?yōu)?true , 就回調(diào) 狀態(tài)改變監(jiān)聽(tīng)器 mStateChangedListener// 該 mStateChangedListener 定義在父類(lèi) StateController 中 // 狀態(tài)控制器創(chuàng)建時(shí) , 會(huì)傳入 mStateChangedListener if (changed) {mStateChangedListener.onControllerStateChanged();}}} }
該代碼路徑為 frameworks/base/services/core/java/com/android/server/job/controllers/ConnectivityController.java , 點(diǎn)擊鏈接可跳轉(zhuǎn)查看完整源碼 ;
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Android 电量优化】JobSch
- 下一篇: 【Android 电量优化】JobSch