荐 【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连
文章目录
推荐代码查看网站 :
上一篇博客 【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 implements
ConnectivityManager.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);
}
@Override
public 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() {
@Override
public 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 , 点击链接可跳转查看完整源码 ;
本文地址:https://blog.csdn.net/han1202012/article/details/107191391
下一篇: 你看,这是我最喜欢的编程语言