Android 后台调度任务与省电详解

I. Handler:

在进程存活的期间有效使用, Google官方推荐使用。

简单易用。

稳定高效。

II. AlarmManager:

利用系统层级的闹钟服务(持有Wake lock)。
如果需要精确的定时任务,这个是最佳选择。

1. 功能

在大概的时间间隔 运行/重复执行 指定任务。

指定精确的时间间隔执行任务。

2. 特征

注册以后,无论是自己的应用进程是否存在/组件是否存在,都会正常执行。

所有注册的闹钟服务都会在系统重启后复位,因此如果需要保证任务,就需要注册RECEIVE_BOOT_COMPLETE,保证重启后,可以重新将任务注册到闹钟服务中。

AlarmManager处理的是一个PendingIntent,因此通常是启动一个服务,进行处理事务。

3. 备注

官方不建议网络请求相关的使用AlarmManager。

考虑到电量损耗,建议非特殊情况使用 大概时间的方式,这样Android会尽量让几个任务打包在一起执行,防止频繁的唤起手机。

III. Job Scheduler:

  1. JobScheduler官方文档
  2. 建议网络相关任务放到Job Scheduler。
  3. 系统重启以后,任务会依然保留在Job Scheduler当中。
  4. 只有在Api21或以上的系统支持

1. 优势

  1. 更节省电量
  2. 更高效
  3. 更易用

2. 明确的指定特定场景下执行(JobInfo):

由于是将多个任务打包在一个场景下执行,因此执行有略微的延后;并且有期限,如果在期限内还没有满足特定情况,系统会将这些任务加入队列,并且随后会进行执行。

  1. 设备开始充电
  2. 空闲
  3. 连接上网络
  4. 断开网络

3. 接口类型

boolean onStartJob(JobParams params) {
  // 开始执行
  // 注意这个方法是在主线程执行的,如果是耗时操作请抛到独立线程中
  // jobFinished(JobParameters params) // 在完成任务并且决定是否还需要定时执行更多任务
  // return 是否是在独立现在还有事务要执行
}

void onStopJob(){
  // 用于清理数据,在结束任务后被回调。
}

IV. GCM

GCM Netwrok Manager实际上在 Api 21 或以上也是使用了 Job Scheduler,在此之前的版本使用的是Google Play Service中实

现Job Scheduler的功能。
在GCMNetworkManager中有很多利于省点的规则。

1. 接口类型

通过 OneoffTask.Builder()与PeriodicTask.Builder()创建任务。

GcmTaskService#onRunTask(TaskParams params)是在后台线程执行的。

触发场景与JobInfo中的一样。

V. Sync Adapter

Transferring Data Using Sync Adapters

通常是用于同步较多的数据。

也许这是Job Scheduler API 21前比较好的替代品。

同步服务端与本地设备中的数据。

1. 特征

  1. 利于大数据同步。
  2. 不需要依赖Google Play Service。
  3. 省电稳定。
  4. 用户可以通过设置中主动查看同步的时间,以及触发同步,或者关闭同步。
  5. API 7 或以上。

2. 备注

可绑定一个账户。

通过提供ContentProvider,并且与服务端同步的数据库。

只有在存在网络的时候才触发同步。

2. 在一定的场景下触发同步

尽可能的打包所有需要同步的任务在一个周期中执行,以此来进行尽可能的节省手机电量。

服务端/设备端数据发生变化。

手机闲置时。

一天。

如果同步失败,会放到同步失败的队列中,在尽可能的时候进行同步。

VI. Doze Mode

Deep Doze Mode

API 23中直接称其为Doze Mode。

无论Target SDK是多少,只要设备是Android API 23或以上会启用该模式。

1. 特征

旨在: 在用户离开设备以后,尽可能的减少手机电量的消耗。

开发人员并不需要做特殊的适配,但是会对上面提到的所有Schedule的方式(Job Scheduler、AlarmManager、Syncs Adapter)进行影响。

通过移动窗口打包任务请求,并且间隔时间会越来越久。

2. 进入条件

会同时满足以下情况过后一段时间(大约30分钟)以后生效:

手机没有在充电

屏幕被关闭

手机各方状态保持稳定

退出条件是,进入条件中任意条件状态发生变化。

3. 在两个处理窗口之间的手机状态

  1. 对所有应用拒绝网络访问。
  2. 所有JobScheduler、Sync-Adapter、AlarmManager的任务都会被延后到窗口中执行。
  3. 系统会拒绝所有来自应用的WAKE-LOCK
  4. 停止所有Wifi以及GPS扫描
  5. 减少位置事件从设备检测WiFi热点。

Light Doze Mode

API 24 或以上会启用该模式

1. 特征

相比Deep Doze Mode,打包任务的频率会更高些

2. 进入条件

会同事满足以下情况后一段时间(大约几分钟)以后生效:

手机没有在充电

屏幕被关闭

处于稳定状态/不稳定状态

或者在以下的条件:

处于Deep Doze Mode

屏幕关闭

手机没有在充电

手机不再处于稳定状态

3. 退出条件

屏幕打开

手机开始充电

进入Deep Doze Mode

4. 在两个处理窗口之间的手机状态

对所有应用拒绝网络访问。

所有JobScheduler与Sync-Adapter的任务都会被延后到窗口中执行。

不会对AlarmManager中的任务进行影响,但是将无网络访问(如果你的任务需要网络访问,是时候改用JobScheduler或Sync-Adapter,保证在任务窗口执行会有网络)

中断/避开Doze

以下所有情况,Google官方都建议不在特殊情景,不要去使用,由于中断了省电的规则。

1. AlarmManager

指定需要精确时间的事件: setAndAllowWhileIdle()、setExactAndAllowWhileIdle()。但是在非窗口期间并不解除无网络访问的限制,并且只有10s的时间给予处理。

指定闹钟事件AlarmManager.setAlarmClock()的事件会在闹钟结束前,令系统短暂的完全退出Doze模式,并且正常处理事件,系统为了突显该闹钟事件,将会在status bar上显示物理闹钟的icon。

2. FCM/GCM

(Firebase Cloud Messaging,旧版中称为Google Cloud Messaging(GCM))。
FCM/GCM中高优先级的任务配置中("priority" : "high") 的消息,在Doze模式下可以正常及时到达。

3. 白名单

白名单官方文档

官方建议可考虑加入白名单的情况

主动请求加入白名单,用户同一以后加入白名单;

用户也可以主动将App从白名单中删除或添加应用;

应用可以通过isIgnoringBatteryOptimizations()来获知是否在白名单中;

白名单的应用可以访问网络与持有有效的WAKELOKE,但是其他Doze的约束依然存在(如延后的Job Scheduler、Syncs-Adapter、AlarmManager);

名单的请求方式:

通过ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS打开电量优化页面,用户可以通过搜索来关闭应用的电量优化,以此加入白名单。

先持有REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限,然后通过启动IntentACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS直接弹出Dialog让用户关闭应用的电量优化,以此加入白名单。

4. 特殊情况

前台服务(foreground-service)将不会受到Doze模式影响。

Doze模式测试

Google官方提供了一些adb命令用于测试Doze模式,而非需要通过等待来进入Doze模式的。

1. 进入Doze模式

准备一台系统是在Android Nougat Devloper Preview4或以上版本的设备。

将其连接连接到电脑。

通过 adb shell dumpsys battery unplug 命令让设备进入未连接充电的模式。

通过 adb shell dumpsys deviceidle step [light|deep] 强行进入Doze模式。

退出Doze模式,让手机恢复正常需要复位充电模式: adb shell dumpsys battery reset。

2. 其他指令

获取设备状态 adb shell dumpsys deviceidle get [light|deep|force|screen|charging|network]。

在Android Nougat Developer Preview 4中,Doze模式的状态周期是:

Light: ACTIVE -> IDLE -> IDLE_MAINTENANCE -> OVERRIDE
Deep: ACTIVE -> IDLE_PENDING -> SENSING -> LOCATING -> IDLE -> IDLE_MAINTENANCE

Choosing the Right Background Scheduler in Android

Diving into Doze Mode for Developers

© 2012 – 2016, Jacksgong(blog.dreamtobe.cn). Licensed under the Creative Commons Attribution-NonCommercial 3.0 license (This license lets others remix, tweak, and build upon a work non-commercially, and although their new works must also acknowledge the original author and be non-commercial, they don't have to license their derivative works on the same terms). http://creativecommons.org/licenses/by-nc/3.0/

以上就是对Android 后台调度任务与省电的资料,有开发Android 应用的朋友可以参考下,谢谢大家对本站的支持!

(0)

相关推荐

  • Android省电的秘密之JobScheduler

    JobScheduler是Android L版本新引入的API,JobScheduler,顾名思义,是用来调度工作.工作被调度的条件包括网络变化,充电插拔,周期执行等.使用场景包括wifi条件下数据下载上传等等.谷歌为什么要引入这个新的API呢?是为了省电而制定的一种规范.想想如果每个开发者都利用这个API进行wifi网络下数据上传,数据上传的操作将会被统一到同一个时间点,批量处理,这样比许多应用单独唤醒要省电的多. 下面展示一个小例子 主MainActivity builder.setRequ

  • Android 后台调度任务与省电详解

    I. Handler: 在进程存活的期间有效使用, Google官方推荐使用. 简单易用. 稳定高效. II. AlarmManager: 利用系统层级的闹钟服务(持有Wake lock). 如果需要精确的定时任务,这个是最佳选择. 1. 功能 在大概的时间间隔 运行/重复执行 指定任务. 指定精确的时间间隔执行任务. 2. 特征 注册以后,无论是自己的应用进程是否存在/组件是否存在,都会正常执行. 所有注册的闹钟服务都会在系统重启后复位,因此如果需要保证任务,就需要注册RECEIVE_BOOT

  • Android OkHttp的简单使用和封装详解

    Android OkHttp的简单使用和封装详解 1,昨天把okHttp仔细的看了一下,以前都是调用同事封装好了的网络框架,直接使用很容易,但自己封装却不是那么简单,还好,今天就来自我救赎一把,就和大家写写从最基础的OKHttp的简单get.post的使用,再到它的封装. 2,OkHttp的简单使用 首先我们创建一个工程,并在布局文件中添加三个控件,TextView(用于展示获取到json后的信息).Button(点击开始请求网络).ProgressBar(网络加载提示框) ①简单的异步Get请

  • Android 消息分发使用EventBus的实例详解

    Android 消息分发使用EventBus的实例详解 1. AndroidStudio使用 dependencies { //最新版本 compile 'org.greenrobot:eventbus:3.0.0' //可以翻倍提高EventBus使用效率 provided 'de.greenrobot:eventbus-annotation-processor:3.0.0-beta1' } 2. 在基类Activity中配置 /** * Activity基类 */ protected Eve

  • Android 网络html源码查看器详解及实例

    Android 网络html源码查看器详解及实例 IO字节流的数据传输了解 Handler的基本使用 1.作品展示 2.需要掌握的知识 FileInputStream,FIleOutputStream,BufferInputStream,BufferOutStream的读写使用与区别 //进行流的读写 byte[] buffer = new byte[1024 * 8]; //创建一个写到内存的字节数组输出流 ByteArrayOutputStream byteArrayOutputStream

  • Android开发Jetpack组件WorkManager用例详解

    目录 一.简介 二.导入 三.基本使用 3.1 定义后台任务 3.2 配置任务运行条件 3.2.1 只需执行一次的任务 3.2.2 周期性执行的任务 3.3 将任务传给 WorkManager 四.高级配置 4.1 设置任务延迟执行 4.2 给任务添加标签 4.3 取消任务 4.3.1 根据标签取消任务 4.3.2 根据 request 的 id 取消任务 4.3.3 取消所有任务 4.4 任务重试 4.5 监听任务结果 4.6 传递数据 4.7 链式任务 一.简介 WorkManager 用于

  • Android快速实现一个财务APP程序详解

    目录 前言 一,系统的技术栈 二,系统界面 三,系统核心代码 前言 昨天有个粉丝朋友也想学开发Web和小程序.安卓,问可以在大学学会吗? 在学校学到的东西真的有限: 在很多的高校,有一些教授是学院派的,他们没有做过多少开发工作,上课就是照本宣科,讲的知识点都是陈年落伍的技术,更别说带学生做项目了. 现在的很多硕博学生帮老师做课件,然后老师上课一顿读. 当然有的老师开发能力也是很强的,他们有开发经验,可以更加全面地理解技术知识点,然后传递给学生,也能拿到一些科研项目,然后带学生实战. 但是,但是,

  • Android车载多媒体开发MediaSession框架示例详解

    目录 一.多媒体应用架构 1.1 音视频传统应用架构 1.2 MediaSession 框架 媒体会话 媒体控制器 二.MediaSession 2.1 概述 2.2 MediaBrowser 2.2.1 MediaBrowser.ConnectionCallback 2.2.2 MediaBrowser.ItemCallback 2.2.3 MediaBrowser.MediaItem 2.2.4 MediaBrowser.SubscriptionCallback 2.3 MediaContr

  • Android 应用程序的启动流程示例详解

    目录 应用进程的启动流程 1.ActivityStackSupervisor.startSpecificActivity 2.ATMS.startProcessAsync 3.LocalService.startProcess 4.startProcessLocked函数 5.ProcessList.startProcessLocked 6.ProcessList.startProcessLocked重载 7.ProcessList.startProcess 8.ZygoteState.star

  • jQuery接受后台传递的List的实例详解

    jQuery接受后台传递的List的实例详解 后台代码: @RequestMapping(params = "getUser") @ResponseBody public List<User> getUser(){ List<User> list = new ArrayList<>(); return list; } 前台代码: $.ajax({ type: "POST", url: "${pageContext.req

  • Android 通过网络图片路径查看图片实例详解

    Android 通过网络图片路径查看图片实例详解 1.在项目清单中添加网络访问权限 <!--访问网络的权限--> <uses-permission android:name="android.permission.INTERNET"/> 2.获取网络图片数据 /** * 获取网络图片的数据 * @param path 网络图片路径 * @return * @throws Exception */ public static byte[] getImage(Str

随机推荐