测试打盹和待机模式

时间:2015-09-03 10:23:07

标签: android android-6.0-marshmallow

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

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。 此外,我的手机中仍然存在网络访问(使用this功能检查)

为什么设备没有进入打盹模式?对于待机模式,here的选项也具有相同的效果。为什么呢?

同样在该计时器中,如果我检查isDeviceIdleMode(),则返回true。

5 个答案:

答案 0 :(得分:1)

我在这里有一些提示:

网络访问

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

检查空闲/打盹模式

没有太多的文档,但是有些方法没有被Doze模式静音。使用CountDownTimer可能就是其中之一。我尝试使用setExact()设置闹钟,当应用程序处于空闲模式时,已记录该闹钟无效。如果您可以在该警报触发时记录某些内容,那么您肯定不会处于空闲状态。

让我知道这对你有用!

答案 1 :(得分:1)

截至目前,行为看起来像这样

  1. isDeviceIdleMode()将返回true。
  2. 应用中的网络可用性检查始终返回true。(使用this功能检查)
  3. 当设备进入和退出打盹模式时,网络没有变化(没有网络广播被触发)。但是,当设备进入并退出打盹模式时,会播放广播(打盹广播)。
  4. 但我们无法在打盹模式下进行网络通话。(尝试使用HttpUrlConnection
  5. getNetworkInfo()在打盹模式下返回true,Android中会报告错误(Link

答案 2 :(得分:0)

我认为网络在打瞌睡时仍会恢复连接(如果你有网络连接),但是如果你尝试做除GCM以外的任何事情,它会给你一个错误。

答案 3 :(得分:0)

REWRITE:我的原始回答假设您的设备实际上并未处于打盹模式,因此improved instructions for getting into Doze modeDiving Into Android 'M' Doze关于IDLE_MAINTENANCE状态的链接指向允许网络活动运行。

我的新假设是(1)当deviceidle step回复Stepped to: IDLE时,设备 处于打盹模式,(2)打盹模式的行为不符合我们的预期。

Google更新了网页Optimizing for Doze and App Standby,但它与您的调查结果不符。他们在Understanding what Doze mode means for your appA flowchart for background work, alarms, and your Android app提供了其他信息。另请参阅Issue 2225

我担心这仍然不能解释你的结果。打盹模式很复杂,记录不足。

Q值。您的应用是否已列入白名单? 优化Doze和App Standby 页面说:

  

白名单中的应用可以在Doze和App Standby期间使用网络并保留部分唤醒锁定。

BTW,命令

adb shell dumpsys deviceidle

显示当前状态(例如IDLE)和其他信息,包括作为打盹先决条件的充电,动作和屏幕开/关状态,以及白名单。这对调试很有用。

答案 4 :(得分:0)

以下是有关空闲模式的一些有用信息:

deviceidle - 是一个新的Android服务,它将始终运行并监听多个系统事件,这些事件可以在空闲模式中触发它(也称为空闲模式)打盹模式):

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

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