测试打瞌睡和待机模式

Testing doze and standby mode

我关闭了我的 Nexus 5 设备的屏幕显示 运行 Android M 然后发出了以下命令。

im17-x0:~ r.j$ adb shell dumpsys battery unplug
im17-x0:~ r.j$ adb shell dumpsys deviceidle step
Stepped to: IDLE_PENDING
im17-x0:~ r.a$ adb shell dumpsys deviceidle step
Stepped to: SENSING
im17-x0:~ r.a$ adb shell dumpsys deviceidle step
Stepped to: IDLE

现在理想情况下,我的设备应该进入空闲模式。但是我在将它置于空闲模式之前启动了 CountDownTimer,它仍然是 运行。 此外,我的 phone 中仍然存在网络访问权限(使用 this 函数检查)

为什么设备不进入休眠模式?遵循 here 中的待机模式选项也具有相同的效果。为什么?

同样在该计时器中,如果我检查 isDeviceIdleMode(),它 returns 为真。

我认为网络在打瞌睡时仍会恢复连接状态(如果您有网络连接),但是如果您尝试执行 GCM 以外的任何操作,它会抛出错误。

重写: 我最初的回答假设您的设备实际上并未处于打瞌睡模式,因此 link 到 improved instructions for getting into Doze mode and Diving Into Android 'M' Doze 关于 IDLE_MAINTENANCE 允许网络活动的状态 运行.

我的新假设是 (1) 当 deviceidle step 回复 Stepped to: IDLE 时,设备 处于 休眠模式,并且 (2) 休眠模式不是表现如我们所料。

Google 已更新页面 Optimizing for Doze and App Standby, but it doesn't jive with your findings. They've provided additional info at Understanding what Doze mode means for your app and A flowchart for background work, alarms, and your Android app. Also see Issue 2225

恐怕这仍然不能解释您的结果。 Doze 模式很复杂且文档不足。

问。您的应用是否已列入白名单? 优化打瞌睡和应用程序待机页面说:

An app that is whitelisted can use the network and hold partial wake locks during Doze and App Standby.

顺便说一句,命令

adb shell dumpsys deviceidle

显示当前状态(例如IDLE)和其他信息,包括充电、运动和屏幕on/off状态,这些都是打瞌睡的先决条件,也是白名单。这对调试很有用。

我在这里为您提供了一些提示:

网络访问

我建议通过实际尝试网络呼叫并将其注销来测试网络访问。在空闲模式下以编程方式检查网络访问有一个记录在案的错误:
https://code.google.com/p/android-developer-preview/issues/detail?id=3164

正在检查 Idle/Doze 模式

那里的文档不多,但是有一些方法没有被打瞌睡模式静音。使用 CountDownTimer 可能就是其中之一。我会尝试使用 setExact() 设置闹钟,该闹钟已被记录在应用程序处于空闲模式时不起作用。如果您可以在警报响起时注销某些内容,那么您肯定没有处于空闲模式。

让我知道这对您有何作用!

截至目前,行为如下所示

  1. isDeviceIdleMode() 将 return 为真。
  2. 应用程序中的网络可用性检查总是 return 正确。(使用 this 函数检查)
  3. 当设备进入和退出休眠模式时,网络没有变化(没有触发网络广播)。但是,当设备进入和退出休眠模式时会触发广播(休眠广播)。
  4. 但是我们无法在打瞌睡模式下进行网络呼叫。(尝试使用 HttpUrlConnection

对于 getNetworkInfo() return 在打瞌睡模式下为真,Android (Link)

中报告了一个错误

这里有一些关于空闲模式的有用信息:

deviceidle - 是一个新的 android 服务,它将始终 运行 并监听可以触发它的几个系统事件 in/out 空闲模式(也称为打瞌睡模式):

1.Screen on/off
2.Charging status
3.Significant motion detect

DeviceIdleController - 当设备唤醒并使用时,控制器处于 ACTIVE 状态。不活动超时、用户关闭屏幕、运动检测等外部事件将驱动状态机进入 INACTIVE。 这个状态机包含七个状态:

1.ACTIVE - Device is in use, or connected to a charge source.
2.INACTIVE - Device has recently come out of the active state, meaning that user turned off the display or unplugged it.
3.IDLE_PENDING - Hold on, we are about to enter idle mode.
4.SENSING
5.LOCATING
6.IDLE - Device is idle.
7.IDLE_MAINTENANCE - Window is open for applications to do processing. Then will back to IDLE.

空闲状态 - 为了使设备进入空闲状态,您可以使用以下 adb 命令:

>adb shell dumpsys battery unplug
>adb shell dumpsys deviceidle force-idle

活动状态 - 为了使设备回到活动状态,您可以模拟以下按键事件:

> adb shell input keyevent KEYCODE_WAKEUP

我还需要一个在活动状态和空闲状态之间切换的快速选项,所以我写了一个批处理脚本 adbIdleModeSwitch.bat 出于这些目的,您可以下载并使用它: https://drive.google.com/file/d/0B81qFnPX_eUUYTMxOTd1UG94NVk/view