Android 6.0 Doze模式和App Standby调研

简介

Android 6.0(API level 23)引入了两个新特性,当设备没有连接到电源时,通过管理应用程序的行为来延长电池的寿命。当设备闲置了很长一段时间,Doze模式通过延迟后台CPU和网络活动来减少电量消耗。当用户最近和App没有互动时,App Standby模式会延迟App的后台网络活动。

Doze和APP Standby模式测试

为了确保完美的用户体验,开发者应该在这两种模式下充分测试自己的App。

进入Doze模式

  1. 准备一台安装了Android 6.0系统的设备
  2. 在开发机器上连接你的设备,然后安装应用
  3. 运行应用
  4. 关闭设备屏幕
  5. 通过命令行进入Doze模式
1
2
$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step

进入App Standby模式

前三步和进入Doze模式的步骤一样,只是不需要关闭屏幕。

通过命令行进入App Standby模式

1
2
$ adb shell dumpsys battery unplug
$ adb shell am set-inactive <packageName> true

通过命令唤醒App

1
2
$ adb shell am set-inactive <packageName> false
$ adb shell am get-inactive <packageName>

App Standby模式对推送的影响

在Doze模式和Standby模式下,第三方推送将会被废,唯一能用的就是Google的GCM。看起来Google希望通过Doze和App Standby来强推GCM。

此处重点研究App Standby模式。通过几个Demo测试,得出以下结果:

  1. 通过startService启动PushService无法把应用从Standby模式唤醒。
  2. 先杀死PushService再startService也是不可行的。
  3. 通过启动应用然后再杀死是可行的,但是会对用户进行干扰。如果选择半夜偷偷启动应用再杀死,未免太过猥琐。

Google在最后关头为开发者提供了一个例外方案:应用可以声明REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限,并主动要求用户将其加入至白名单中,从而不受Doze Mode和App Standby的影响。