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,闹铃,并允许应用连接网络。

android 待机程序运行 安卓应用待机_android 待机程序运行

在每个维护窗口结束时,系统重新进入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和应用待机影响了核心功能。

可以

 

自动化任务应用

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

如果可用

可以

 

外围设备配套程序

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

如果可用

可以

 

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

如果可用

不可