我稍微修改了这个应用: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分钟后消失。
感谢您的帮助。
答案 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