Contents

Doze和应用待机优化... 1

理解Doze. 1

Doze的限制... 1

调整应用适应Doze. 2

理解应用待机... 2

设备idle时用FCM和应用交互... 3

其他情况的支持... 3

测试Doze和应用待机... 4

测试Doze下的应用... 4

应用待机时测试应用... 4

可以白名单的情况... 5

Doze和应用待机优化

从Android 6.0(API 23)开始,Android引入了一套改善电池寿命的功能特性,这套特性在手机不连电源的时候,通过改变应用行为方式来省电。当设备长时间不用的时候,Doze通过延迟应用对后台的CPU和网络请求来省电。应用待机通过延迟用户长时间没使用的应用的对后台网络的请求省电。

当设备进入Doze模式时,应用对某些耗电资源的请求会被延迟到维护窗口。这些特定限制列在电源管理限制中。

Doze和应用待机管理所有运行在Android 6.0及之后的平台上的应用,不管它是否将目标API设为23。为了保证最好的用户体验,请在Doze和应用待机情况下测试你的应用并做出必要调整。下面提供细节。

理解Doze

当用户不插电,保持一段时间不动手机,关屏幕一段时间后,手机进入Doze模式。在Doze模式,系统通过限制应用连接网络和高CPU消耗的服务来省电。系统还会禁止应用联网,延时job,同步和标准闹铃的请求。

系统周期性的短期退出Doze模式让应用在维护窗口期完成被延时的操作。在维护窗口期,系统将执行所有延时的同步,job,闹铃,并允许应用连接网络。

在每个维护窗口结束时,系统重新进入Doze模式,挂起网络,并延时job,同步和闹铃。随着时间的推移,系统进入维护窗口的周期越来越长,保证手机不连电源并长时间不用的时候省电。

只要用户移动手机或者打开屏幕或者连上电源等唤醒手机,系统就会退出Doze模式,所有的应用恢复正常运行模式。

Doze的限制

在Doze模式下,存在下面的限制:

  • 网络被挂起。
  • 系统忽略唤醒锁。
  • 标准的AlarmManager闹铃(包括setExact()和setWindow())被延时到下一个维护窗口。
    • 如果你要设一个在Doze模式下依然唤醒的闹铃,需要用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。
    • 用setAlarmClock()设的闹铃会正常启动——系统在这种闹铃启动之前短期退出Doze。
  • 系统不进行WIFI扫描。
  • 系统不允许同步运行。
  • 系统不允许JobScheduler运行。

Doze备忘录

  • 如果可能,用FCM下发消息。
  • 如果需要让用户马上看到一条通知,调用高优先级FCM消息。
  • 初始化消息时,提供足够的信息,而不是在后续的操作中不断进行网络请求。
  • 紧急的闹铃用setAndAllowWhileIdle()和setExactAndAllowIdle()设。
  • 测试应用在Doze模式下的工作情况。

调整应用适应Doze

应用提供的功能和他们使用的服务的不同决定了Doze对应用的影响不同。很多应用不用改也能在Doze模式下正常工作。但有些情况下,你必须优化应用管理网络,闹钟,job或同步的处理。应用应该在维护窗口期高效的管理活动。

Doze最有可能影响AlarmManager的闹铃和计时器的功能,因为在Android 5.1(API 22)之前的所有闹铃在Doze模式下都不会启动。

为了调度闹铃,Android6.0(API23)提供了两个新方法:setAndAllowWhileIdle()和setExactAndAllowWhileIdle()。有了这些方法,你可以设置在Doze模式下依然启动的闹钟。

注意:应用通过setAndAllowWhileIdle()和setExactAndAllowWhileIdle()设的闹钟9分钟内最多启动一次。

Doze对网络的限制也可能影响你的应用,尤其会影响那些实时消息,比如通知。如果你的应用要一直联网接受消息,那么尽量使用FCM。

你可以用adb命令把手机设置成Doze模式,或从Doze模式恢复,然后测试应用。详情请看:Doze和应用待机测试。

理解应用待机

应用待机即当用户长时间不用某个应用的时候,系统把那个应用归为idle状态。系统在用户查功能时间没使用某个应用并且不满足以下任意一点时,把应用归为idle:

  • 用户显示启动该应用。
  • 应用有一个前台进程(如Activity或前台服务,或正在被其他activity或前台服务调用)。

注意:你只能在用户期望系统马上执行或不希望被打断的情况下使用前台服务。具体例子包括通过社交软件上传图片,音乐播放器应用不在前台时播放音乐。不应该为了不让系统把你的应用设为idle状态而启动前台服务。

  • 要在锁屏界面或通知栏显示给用户一个通知。
  • 应用是一个活动的设备管理应用(比如,设备策略控制器应用)。尽管他们只在后台运行,设备管理应用永远不会被置为待机模式,因为他们随时要从服务器接收策略配置消息。

当设备连上外接电源时,系统恢复所有应用的待机状态,允许他们进行网络连接并执行被推迟的job和同步操作。如果系统进入idle状态很长时间了,系统大约允许idle应用 一天连一次网。

设备idle时用FCM和应用交互

FCM是一个 云对设备的服务,这个服务使得后端的服务器实时向Android设备上的应用发送消息。FCM提供了一个独立的持续的后台连接,所有需要实时消息的应用都可以分享这个连接。这个分享的连接大大降低了电源的消耗,因为大量应用各自维护自己对后台的持续的网络连接会快速降低电量。鉴于此,如果您的应用需要后台服务的消息,强烈建议你尽可能使用FCM,而不是维护自己的持续网络连接。

FCM做了优化从而能够在Doze和应用待机下,通过高优先级消息进行工作。FCM的高优先级消息能够可靠的在Doze或者应用idle状态下,使用网络连接。在Doze和应用待机状态下,系统传输完消息或临时给应用开通了网络或唤醒锁后,系统或应用重新进入idle。

高优先级FCM消息不另外影响Doze和应用待机模式。这意味着你的应用可以在最低的电量消耗下进行高效的网络交互。

如果你的应用需要下行的消息,作为最基本的最好的练习,最好使用FCM。如果你的服务和客户端已经使用了FCM,用高优先级消息传输紧急消息,因为它可以在Doze和应用待机下正常工作。

其他情况的支持

几乎所有的应用都应该支持Doze,合适的管理网络连接,闹铃,job和同步,适时使用高优先级FCM消息。对于另一小部分情况,这些还不够。对这些情况,系统提供了一个可配置的白名单的功能,白名单中的应用不受Doze和应用待机的影响。

白名单中的应用可以在Doze或应用idle状态使用网络或保持唤醒锁。但其他限制依然适用。例如,白名单应用依然会被延迟job和同步(API 23及以上),常规AlarmManager的闹钟不会启动。应用可以通过调用isIgnoringBatteryOptimizations()查看自己是否在白名单。

用户可以通过设置->电源->电池优化手动配置白名单。系统提供了几种不同的方法让用户决定是否将某些应用加入白名单。

  • 应用可以发送ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS intent,把用户带到电池优化及面,在这个界面,用户可以把应用加入白名单。
  • 拥有REQUEST_IGNORE_BATTERY_OPTIMIZATION权限的应用可以触发一个系统对话框,让用户直接把该应用加入白名单,而不用进入设置界面。应用发送ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATION intent触发这个对话框。
  • 用户可以手动将应用从白名单移除。

询问用户把你的应用加入白名单之前,请确保应用满足白名单的可接受情况。

注意:Google Play的策略是禁止应用直接请求豁免Android6.0+的电源管理功能(Doze和应用待机),除非核心功能受很大影响。

测试Doze和应用待机

为了保证用户体验,应该在Doze和应用待机情况下对应用进行充分的测试。

测试Doze下的应用

通过下面的步骤对Doze进行测试:

  1. 装载Android6.0或以上版本
  2. 连接设备并安装应用
  3. 运行应用使其进入激活状态
  4. 运行下面的命令强制系统进入idle

$ adb shell dumpsys deviceidle force-idle

  1. 准备好后,运行下面的命令退出idle
$ adb shell dumpsys deviceidle unforce
  1. 运行下面的命令重新激活设备
$ adb shell dumpsys battery reset
  1. 观察重新激活设备后应用的行为,确保当设备推出idle时应用行为合适。

应用待机时测试应用

要在应用待机时测试应用:

  1. 装载Android6.0或以上版本
  2. 连接设备并安装应用
  3. 运行应用使其进入激活状态
  4. 通过运行下面的命令,把应用设置成应用待机模式:
$ adb shell dumpsys battery unplug
$ adb shell am set-inactive <packageName> true
  1. 通过运行下面的命令,模拟唤醒应用:
$ adb shell am set-inactive <packageName> false
$ adb shell am get-inactive <packageName>
  1. 重新唤醒应用后观察应用的行为。确保应用从待机模式恢复后反映合适。尤其是要检查应用的通知和后台job像期望的那样工作。

可以白名单的情况

下表重点标出了可以白名单的情况。一般情况下,应用不应在白名单中,除非Doze或应用待机下核心功能受到很大影响或者由于技术原因不能使用高优先级FCM消息。

更多信息,请看其他情况的支持。

类型

用例

能否用FCM?

可白名单

注意

即时消息,聊天,电话

需求是即时设备处于Doze和应用待机模式下,也要给用户实时消息

是的,能用FCM

不可

应该用高优先级FCM消息唤醒应用连接网络。

是的,但没用高优先级FCM消息

即时消息,聊天,电话;企业VOIP应用

不,不能用FCM,因为技术上使用了另一个消息服务器,或者Doze和应用待机影响了核心功能。

可以

自动化任务应用

应用的基本功能是调度自动活动,例如即时消息,语音呼叫,新图象管理,位置活动

如果可用

可以

外围设备配套程序

应用的核心功能就是和外围设备保持连接并向外围设备提供网络连接。

如果可用

可以

应用只需周期性的和外围设备进行同步或者应用只需要与外围设备,比如无线耳机,通过蓝牙连上。

如果可用

不可

Android Doze和应用待机优化相关推荐

  1. Android  Doze and App Standby模式详解

    Android  Doze and App Standby模式详解 来源:腾云阁 https://www.qcloud.com/community Optimizing for Doze and Ap ...

  2. Android Doze模式和app Standby模式

    对低电耗模式(app Standby)和应用待机模式(Doze)进行针对性优化 从 Android 6.0(API 级别 23)开始,Android 引入了两个省电功能,可通过管理应用在设备未连接至电 ...

  3. android doze模式源码分析,Android Doze模式启用和恢复详解

    从Android 6.0(API level 23)开始,Android提出了两个延长电池使用时间的省电特性给用户.用户管理可以在没有充电的情况下管理app的行为.当用户一段时间没有使用手机的时候,D ...

  4. android 对for循环进行优化

    今天,简单讲讲如何对for循环进行优化. 完成同样的功能,用不同的代码来实现,性能上可能会有比较大的差别,所以对于一些性能敏感的模块来说,对代码进行一定的优化还是很有必要. 作为三大结构之一的循环,在 ...

  5. Android 进阶第二篇——性能优化

    Android 进阶第二篇--性能优化 一些Android书籍喜欢把性能优化放在最后的章节,简单提一提作为内容全面的点缀.在这里我将工具使用和性能优化的一些个人经验放在进阶系列博客的开始,因为我认为防 ...

  6. Android后台耗电分析及优化

    原文见: 在路上的blog Android后台耗电分析及优化 一.什么是耗电优化? 二.耗电优化第一个方向:优化后台耗电 1.唤醒锁定操作卡住(前台&后台) 2.唤醒次数过多 3.WLAN扫描 ...

  7. Android App包瘦身优化

    Android App包瘦身优化 APK瘦身是对程序体验的优化,更大的APK需要占用更多的存储空间. APK的构成 APK瘦身前通过Analyze app分析出来的图片(打开方式:Android St ...

  8. Gradle For Android(三)Gradle优化与灵活的使用技巧

    <Gradle For Android(三)Gradle优化与灵活的使用技巧 > 转载请注明来自傻小孩b(gold.xitu.io/user/57e089-喜欢的可以关注我,不定期总结文章 ...

  9. Android Q app内存压缩优化方案介绍

    Android Q app内存压缩优化方案介绍 原创文章,谢绝转载! Android Q新增了部分系统性能优化方案,这里简单学习下,本篇文章先分析app compaction. 一.愿景: 在保证后台 ...

最新文章

  1. Window10 VS17下 Opencv3.4.5配置
  2. Windows中的tree命令不可用的解决办法
  3. Angular1.x的自定义指令directive参数配置详细说明
  4. 失败原因_解析干洗店失败原因
  5. Introduction to 3D Game Programming with DirectX 12一书学习记录(第一个例子编译错误)
  6. 阿里云SLB(负载均衡)获取真实ip地址, log_format配置
  7. pycharm调试远程服务器代码
  8. springboot项目中使用shiro 自定义过滤器和token的方式___shiro使用token登录流程
  9. AjaxPro使用说明
  10. 在html中代码规范是哪个键,HTML代码规范经验
  11. mysql按 当前时间和规定时间大小排序_为什么 MySQL 使用 B+ 树· Why#x27;s THE Design?(009)...
  12. UVa 120 - Stacks of Flapjacks
  13. python容量变化类型有哪些_python基础数据类型补充以及编码的进阶
  14. python labelencoder参数_对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
  15. iapp模块的使用教程,iapp怎么调用api
  16. 微信运动服务器刷新,微信运动多久更新一次步数(微信运动刷新时间表)
  17. 7-56 福到了 (15 分)
  18. Synopsys Formality Workshop 2013
  19. 个人中端深度学习工作站配置(硬件系统篇)
  20. 老夫纵横IT行业20年,才总结出这份独步天下的分布式进阶笔记

热门文章

  1. 什么是 immutable
  2. java获取当前时间代码(适合于是springboot+vue+java)
  3. 视频太大怎么在线压缩大小?
  4. html+css页面练习3
  5. 将数组变成json格式
  6. EMQX(五)—JAVA客户端连接操作EMQX服务
  7. python爬取微信朋友圈图片_使用python itchat包爬取微信好友头像形成矩形头像集的方法...
  8. imac 无线路由设置 无法上网 链接感叹号 dns 查找失败
  9. 可观测可回溯 | Continuous Profiling 实践解析
  10. uniapp中的input,输入input回车事件和输入input事件