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 应用的朋友可以参考下,谢谢大家对本站的支持!
上一篇: java编写的简单移动方块小游戏代码
下一篇: php中实现字符串翻转的方法