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

I. Handler:

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

简单易用。

稳定高效。

II. AlarmManager:

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

1. 功能

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

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

2. 特征

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

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

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

3. 备注

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

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

III. Job Scheduler:

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

1. 优势

更节省电量 更高效 更易用

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

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

设备开始充电 空闲 连接上网络 断开网络

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. 特征

利于大数据同步。 不需要依赖Google Play Service。 省电稳定。 用户可以通过设置中主动查看同步的时间,以及触发同步,或者关闭同步。 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. 在两个处理窗口之间的手机状态

对所有应用拒绝网络访问。 所有JobScheduler、Sync-Adapter、AlarmManager的任务都会被延后到窗口中执行。 系统会拒绝所有来自应用的WAKE-LOCK 停止所有Wifi以及GPS扫描 减少位置事件从设备检测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 应用的朋友可以参考下,谢谢大家对本站的支持!

时间: 2024-09-20 01:03:08

Android 后台调度任务与省电详解的相关文章

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

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

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

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

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编程实现自定义手势的方法详解_Android

本文实例讲述了Android编程实现自定义手势的方法.分享给大家供大家参考,具体如下: 之前介绍过如何在Android程序中使用手势,主要是系统默认提供的几个手势,这次介绍一下如何自定义手势,以及如何对其进行管理. 先介绍一下Android系统对手势的管理,Android系统允许应用程序把用户的手势以文件的形式保存以前,以后要使用这些手势只需要加载这个手势库文件即可,同时Android系统还提供了诸如手势识别.查找及删除等的函数接口,具体如下: 一.加载手势库文件: staticGestureL

Android开发之Animations动画用法实例详解_Android

本文实例讲述了Android开发之Animations动画用法.分享给大家供大家参考,具体如下: 一.动画类型 Android的animation由四种类型组成:alpha.scale.translate.rotate XML配置文件中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果 Java Code代码中 AlphaAnimation 渐变透明度动画效果 ScaleAnimation 渐变尺寸

我的Android进阶之旅------>HTTP Header 详解

HTTP(HyperTextTransferProtocol)即超文本传输协议,目前网页传输的的通用协议.HTTP协议采用了请求/响应模型,浏览器或其他客户端发出请求,服务器给与响应.就整个网络资源传输而言,包括message-header和message-body两部分.首先传递message- header,即http header消息.http header 消息通常被分为4个部分:general  header, request header, response header, enti

Android学习笔记之ContentProvider和Uri详解_Android

本文介绍了自定义Content Provider的相关内容,完全解析内容提供者的用法.Content Provider,内容提供者,相信大家对这个组件的名字都不陌生,可能是自己平时做的都是一些简单的App,所以对于Content Provider的使用并不是很多,也不是特别熟悉.但是这里还是对Content Provider作个简单的总结,不是很深入,但是希望能给包括我在内的初学者一点帮助,看完这篇能对这个组件有个总体上的了解. 一.使用ContentProvider(内容提供者)共享数据 Co

Android中asset和raw的区别详解_Android

*res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到 R.java中,访问的时候需要AssetManager类. 2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹 *读取文件资源

Android编程中context及全局变量实例详解_Android

本文实例讲述了Android编程中context及全局变量的用法.分享给大家供大家参考,具体如下: 今天在研究context的时候,对application和activity context有了一定的了解,下面是从网上复制过来的资料 Application context和Activity context的区别: 这是两种不同的context,也是最常见的两种.第一种中context的生命周期与Application的生命周期相关的,context随着Application的销毁而销毁,伴随ap