JobScheduler官方文档
建议网络相关任务放到Job Scheduler。
系统重启以后,任务会依然保留在Job Scheduler当中。
只有在Api21或以上的系统支持
由于是将多个任务打包在一个场景下执行,因此执行有略微的延后;并且有期限,如果在期限内还没有满足特定情况,系统会将这些任务加入队列,并且随后会进行执行。
boolean onStartJob(JobParams params) {
// 开始执行
// 注意这个方法是在主线程执行的,如果是耗时操作请抛到独立线程中
// jobFinished(JobParameters params) // 在完成任务并且决定是否还需要定时执行更多任务
// return 是否是在独立现在还有事务要执行
}
void onStopJob(){
// 用于清理数据,在结束任务后被回调。
}
GCM Netwrok Manager实际上在 Api 21 或以上也是使用了 Job Scheduler,在此之前的版本使用的是Google Play Service中实现Job Scheduler的功能。
在 GCMNetworkManager 中有很多利于省点的规则。
OneoffTask.Builder()
与 PeriodicTask.Builder()
创建任务。 GcmTaskService#onRunTask(TaskParams params)
是在后台线程执行的。 触发场景与JobInfo中的一样。
Transferring Data Using Sync Adapters
同步服务端与本地设备中的数据。
尽可能的打包所有需要同步的任务在一个周期中执行,以此来进行尽可能的节省手机电量。
API 23中直接称其为Doze Mode。
无论Target SDK是多少,只要设备是Android API 23或以上会启用该模式。
通过移动窗口打包任务请求,并且间隔时间会越来越久。
会同时满足以下情况过后一段时间(大约30分钟)以后生效:
退出条件是,进入条件中任意条件状态发生变化。
WAKE-LOCK
API 24 或以上会启用该模式
会同事满足以下情况后一段时间(大约几分钟)以后生效:
或者在以下的条件:
以下所有情况,Google官方都建议不在特殊情景,不要去使用,由于中断了省电的规则。
setAndAllowWhileIdle()
、 setExactAndAllowWhileIdle()
。但是在非窗口期间并不解除无网络访问的限制,并且只有10s的时间给予处理。 AlarmManager.setAlarmClock()
的事件会在闹钟结束前,令系统短暂的完全退出Doze模式,并且正常处理事件,系统为了突显该闹钟事件,将会在status bar上显示物理闹钟的icon。 (Firebase Cloud Messaging,旧版中称为Google Cloud Messaging(GCM))。
FCM/GCM中高优先级的任务配置中( "priority" : "high"
) 的消息,在Doze模式下可以正常及时到达。
白名单官方文档
官方建议可考虑加入白名单的情况
isIgnoringBatteryOptimizations()
来获知是否在白名单中; 白名单的请求方式:
前台服务(foreground-service)将不会受到Doze模式影响。
Google官方提供了一些adb命令用于测试Doze模式,而非需要通过等待来进入Doze模式的。
adb shell dumpsys battery unplug
命令让设备进入未连接充电的模式。 adb shell dumpsys deviceidle step [light|deep]
强行进入Doze模式。 退出Doze模式,让手机恢复正常需要复位充电模式: adb shell dumpsys battery reset
。
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
© 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/