Android M Doze状态本身有多个状态吗?

时间:2015-08-13 22:44:29

标签: android adb alarmmanager alarm android-6.0-marshmallow

我稍微修改了这个应用:https://github.com/commonsguy/cw-omnibus/tree/master/JobScheduler

它使用setExactAndAllowWhileIdle设置警报并安排警报每1分钟关闭并记录它。

根据Doze文档,如果此应用在手机处于打盹模式时正在运行,则每15分钟只应关闭一个闹钟。我没有看到这种行为。

在运行Android M的nexus 5上启动应用程序和整个警报调度过程后,我使用提供的abd命令将手机放入Doze ...

adb shell dumpsys电池拔出 adb shell dumpsys deviceidle步骤 adb shell dumpsys deviceidle -h

...从日志中,我看到每分钟有大约30分钟的警报响起,最后它们相隔15分钟大约一个小时。然后回到每分钟一次,然后再回到15分钟。在测试期间,手机完全没有受到干扰。

有谁知道这是为什么?我的印象是,在这些adb命令之后手机将立即处于打盹模式,并且警报将在距离开始15分钟后消失。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

首先,相关的adb命令文档不完整,正如您在ISSUE 2930的链接中所述。

以下命令仅打印使用信息:

adb shell dumpsys deviceidle -h

以下命令将显示当前状态,包括进入IDLE的先决条件(启用,不移动,不充电,屏幕关闭):

adb shell dumpsys deviceidle

  Settings:
    ...
  Whitelist (except idle) system apps:
    ...
  Whitelist (except idle) all app ids:
    ...
  mEnabled=true
  mForceIdle=false
  mSigMotionSensor=null
  mCurDisplay=...
  mScreenOn=false
  mCharging=false
  mSigMotionActive=false
  mState=INACTIVE

这表明您是否需要进行更多设置。例如。它似乎需要在模拟器的电源按钮上进行2或3次点击才能获得mScreenOn=false

以下命令步骤朝向IDLE模式,但是ISSUE 2930解释了您需要多次步进以进入INACTIVE,IDLE_PENDING,SENSING,然后IDLE:

adb shell dumpsys deviceidle step

以下命令将强制它进入空闲状态:

adb shell dumpsys deviceidle force-idle

BTW最近对Doze and App Standby的开发人员文档进行了改进。

答案 1 :(得分:1)

当设备处于空闲模式时,setExactAndAllowWhileIdle的速率限制会有所不同。我猜你手机通过Doze进入空闲模式需要30分钟,此时你每15分钟只能拨打setExactAndAllowWhileIdle一次。

在打盹模式下,手机将定期唤醒,闲置维护期最长为10分钟。在这10分钟内,它将从空闲模式唤醒,您的速率限制将调整为每分钟一次。维护窗口结束后,您会看到它每15分钟返回一次。

空闲维护窗口在文档中描述:http://developer.android.com/training/monitoring-device-state/doze-standby.html#understand_doze