文章目录

  • 一、JobServiceContext 引入
  • 二、JobServiceContext 源码分析
  • 三、用户在应用层如何使用 JobScheduler
  • 四、用户提交任务
  • 五、广播接收者监听广播触发 JobService 执行任务

推荐代码查看网站 :

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

  • http://androidxref.com/

一、JobServiceContext 引入


上一篇博客 【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 源码分析


在 JobServiceContext 类的 executeRunnableJob 方法的作用 : 该方法传递一个 Job 任务给 JobServiceContext 执行 , 调用者需要先检查如下两个条件 :

  • 当前是否有运行中的任务 , getRunningJob() 必须为空 ;
  • 同时还需要确保该 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


先讲解用户在应用层如何使用 JobScheduler :

在 【Android 电量优化】电量优化 ( JobScheduler | JobService | AsyncTask ) 博客中 , 讲解了 JobScheduler 如何使用 ;

  • 获取服务 : 首先获取系统的 JobScheduler 服务 , 就是之前分析的 JobSchedulerService 类 ;
  • 创建任务 : 创建 JobInfo 任务信息 , 使用 JobScheduler 提交该任务 ; mJobScheduler.schedule(jobInfo) ;
  • 自定义 JobService : 开发者在应用中自定义 JobService 服务 ;
  • 服务执行 : 系统会在合适的时间调用 JobService 服务的 boolean onStartJob(JobParameters params) 方法 ;

其中涉及到两个入口 , 一个是用户提交任务 , 另一个是系统在某个时间回调 JobService 服务中的开始执行任务方法 ;

主要针对上述两个入口进行分析 ;

用户提交任务的驱动事件是开发者写的提交任务的代码 ;

系统回调 JobService 服务的驱动事件 , 是用户对手机的操作 , 如插拔电源线 , 切换 WIFI 网络等操作 , 这些操作触发广播 , 相应广播接收者收到这些广播 , 就会触发一系列相关的操作 ;

四、用户提交任务


分析用户提交任务 :

【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 ) 博客中讲解了如下内容 :

  • JobScheduler 提交任务的方法 schedule(jobInfo) , 最终调用的是 JobSchedulerService 中的 schedule 方法 ;
  • 在 schedule 方法中调用了 scheduleAsPackage 方法 , 传入任务相关信息 , 进行了一系列的状态判定 ;
  • 在 scheduleAsPackage 方法中调用 startTrackingJob 方法 , 该方法中遍历所有的状态控制器 , 确保所有相关的控制器知道该状态 ;

【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 ) 博客中接着上面的博客继续分析 :

  • 在 startTrackingJob() 方法中 , 调用状态控制器 StateController 的 maybeStartTrackingJobLocked 方法 , 该方法的作用是更新所有对应的状态控制器监听的任务 ;

五、广播接收者监听广播触发 JobService 执行任务


广播接收者监听广播 : 这是触发系统回调 JobService 服务的入口 ;

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

  • 注册广播接收者 : ConnectivityController 中注册了广播接收者 , 用于监听 ConnectivityManager.CONNECTIVITY_ACTION 广播 , 这是网络状态改变后发出的广播 ;
  • 广播接收者收到网络状态改变的广播后 , 会调用 updateTrackedJobs(-1) 方法 ;
  • 该方法会更新所有对网络状态敏感的任务 , 例如有的任务要求在 WIFI 条件下执行 , 此时就会触发该任务的状态改变 ;
  • updateTrackedJobs 方法中又会调用 状态改变监听器 mStateChangedListener 的 onControllerStateChanged 方法 ;
  • 状态改变监听器 mStateChangedListener 就是 JobSchedulerService 类 ;

【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | 任务检查 | 任务执行 ) 博客中讲解后续操作 :

  • 在实现的 StateChangedListener 接口的 onControllerStateChanged() 回调方法中 , 使用 JobHandler mHandler 发送了 MSG_CHECK_JOB 消息 ;
  • JobHandler 中接收上述消息 , 并检查任务 , 最终调用 maybeRunPendingJobsH() 方法 , 执行任务 ;
  • 在 maybeRunPendingJobsH 方法中 , 调用 assignJobsToContextsLocked , 执行任务 ;
  • 在 assignJobsToContextsLocked 方法中 , 最终调用了 JobServiceContext 执行 executeRunnableJob(pendingJob) 方法 , 用于执行 pendingJob 任务 ;
  • 最终在 JobServiceContext 中绑定用户自定义的 JobService , 开始执行任务 , 会自动回调下面代码中的 onStartJob 方法 ;
public class BpJobService extends JobService {@Overridepublic boolean onStartJob(JobParameters params) {// 启动 AsyncTask 异步任务处理工作new JobAsyncTask().execute(params);return false;}// ... 省略部分代码
}

本篇博客涉及到的源码 :

  • /frameworks/base/services/core/java/com/android/server/job/JobSchedulerService.java
  • frameworks/base/services/core/java/com/android/server/job/controllers/ConnectivityController.java
  • /frameworks/base/services/core/java/com/android/server/job/JobServiceContext.java

【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★相关推荐

  1. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | 任务检查 | 任务执行 )

    文章目录 一.回调 StateChangedListener 接口 二.JobHandler 处理 ( 任务检查 ) 三.maybeRunPendingJobsH 方法 四.assignJobsToC ...

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

    文章目录 一.ConnectivityController 连接控制器引入 二.ConnectivityController 构造方法解析 ( 注册接收者 ) 三.mConnectivityRecei ...

  3. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 )

    文章目录 一.JobScheduler 提交任务 schedule 方法源码分析 二.schedule(JobInfo job, int uId) 方法 三.scheduleAsPackage 方法 ...

  4. 【Android 电量优化】电量优化 ( Battery Historian 环境要求 | 电量分析报告 | 电量优化三原则 | 电量优化注意事项 )

    文章目录 一.Battery Historian 环境要求 二.上传电量报告 三.Battery Historian 电量分析报告 四.电量优化三原则 五.电量优化注意事项 参考 Google 官方文 ...

  5. 【Android 电量优化】电量优化 ( 获取电量分析报告 | 阿里云服务器搭建 Battery Historian | 上传并生成分析报告 )

    文章目录 一.Battery Historian 搭建环境 二.获取 Android 手机电量报告 1.重置电量状态 2.开启获取 WeakLock 信息 3.获取手机电量报告 三.阿里云服务器搭建 ...

  6. 【Android 电量优化】电量优化 ( 使用 AlarmManager 保持 CPU 唤醒 )

    文章目录 一.AlarmManager 简介 二.使用 AlarmManager 保持 CPU 唤醒流程 ( 省电操作 ) 三.使用 WeakLock 保持 CPU 唤醒 代码示例 1.Service ...

  7. 【Android 电量优化】电量优化 ( 充电状态获取 | 主动获取充电状态 | 广播接受者监听充电状态 | 被动获取充电状态 | 注册空广播接受者获取历史广播 )

    文章目录 一.获取充电状态 二.被动获取充电状态 三.主动获取充电状态 参考 Google 官方文档 : 优化电池续航时间 一.获取充电状态 在应用中执行某些操作 , 如软件云端备份 , 从服务器端获 ...

  8. 【Android 电量优化】电量优化 ( JobScheduler | JobService | AsyncTask )

    文章目录 一.JobScheduler 使用流程 二.AsyncTask 简介 三.JobScheduler 开发流程 四.JobScheduler 代码示例 1.JobScheduleManager ...

  9. 你是否了解APP耗电问题?深入探索 Android 电量优化,flutter插件推荐

    3).最后,把电量输送给电池,而整个降压的过程中会产生热能. 分类 1).高压低电流快充方案:在充电过程中提升充电电压(7-20V)来提升充电功率. 2).低压大电流快充方案:在电压一定情况下,增加电 ...

最新文章

  1. 恐惧、野心和迷茫,机器人公民背后的未来世界
  2. 50 xen虚拟化技术基础、xen虚拟化技术进阶
  3. 使用 Ant 自动生成项目构建版本
  4. Zuul:构建高可用网关之多维度限流
  5. centos rpm安装mysql5.5_CentOS 5.5下RPM方式安装MySQL 5.5 详解
  6. 基于当前分支的某一个commit号创建分支
  7. sql错误索引中丢失_收集,汇总和分析丢失SQL Server索引统计信息
  8. android 对java 支持_Android在未来对 Java 8 特性的支持
  9. 洛谷——P1219 [USACO1.5]八皇后 Checker Challenge
  10. windows配置端口映射
  11. 计算机控制系统与常规仪表控制系统的主要异同点,计算机控制技术复习资料-20210711112641.doc-原创力文档...
  12. php 图片上加文字,PHP语言之给图片添加文字(支持中文)//PHP函数
  13. 【Kafka】Cancelled fetchMetadata request with correlation id due to node -1 being disconnected
  14. --hot 和 --inline的区别
  15. 【WSN定位】基于matlab灰狼算法优化无线传感器非测距定位【含Matlab源码 2008期】
  16. VS Reporting Service--新建报表
  17. 服务器运行时将杀毒软件关掉,教你快速关闭禁用Windows 10自带的杀毒软件Windows Defender...
  18. 一个很精致的HelloWorld,你看得懂么?
  19. Web3+品牌的大杀器:DAO如何实现对传统品牌彻底的降维打击
  20. OpenCv相机标定——圆形标定板标定

热门文章

  1. Javascript刷新全集
  2. 渗透测试-基于白名单执行payload--Compiler
  3. npm: 权限阻止修复
  4. 第01章 初识Mysql
  5. IE下a标签会触发window.onbeforeunload的问题
  6. js中获得当前时间是年份和月份
  7. Spring in Action 入门之面向切面编程AOP
  8. 【缅怀妈妈系列诗歌】之十:妈妈,孩儿答应您
  9. 关于scrollTop为0以及解决方法
  10. 算法学习:后缀数组(SA)