推荐代码查看网站 :
https://www.androidos.net.cn/sourcecode ( 推荐 )
http://androidxref.com/
上一篇博客 【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 类的 executeRunnableJob 方法的作用 : 该方法传递一个 Job 任务给 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 :
在 【Android 电量优化】电量优化 ( JobScheduler | JobService | AsyncTask ) 博客中 , 讲解了 JobScheduler 如何使用 ;
其中涉及到两个入口 , 一个是用户提交任务 , 另一个是系统在某个时间回调 JobService 服务中的开始执行任务方法 ;
主要针对上述两个入口进行分析 ;
用户提交任务的驱动事件是开发者写的提交任务的代码 ;
系统回调 JobService 服务的驱动事件 , 是用户对手机的操作 , 如插拔电源线 , 切换 WIFI 网络等操作 , 这些操作触发广播 , 相应广播接收者收到这些广播 , 就会触发一系列相关的操作 ;
分析用户提交任务 :
【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 ) 博客中讲解了如下内容 :
【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 ) 博客中接着上面的博客继续分析 :
广播接收者监听广播 : 这是触发系统回调 JobService 服务的入口 ;
在 【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 ) 博客中分析到
【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | 任务检查 | 任务执行 ) 博客中讲解后续操作 :
public class BpJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// 启动 AsyncTask 异步任务处理工作
new JobAsyncTask().execute(params);
return false;
}
// ... 省略部分代码
}
本篇博客涉及到的源码 :