【问题标题】:Does the Android M Doze state have multiple states itself?Android M Doze 状态本身是否有多个状态?
【发布时间】:2015-11-07 02:14:20
【问题描述】:

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

它使用 setExactAndAllowWhileIdle 设置警报,并安排警报每 1 分钟响一次并记录下来。

根据 Doze 文档,如果此应用在手机处于 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 分钟响起。

感谢您的帮助。

【问题讨论】:

  • FWIW,我不关心命令,因为我不信任它们。我只是让设备在自己(缺乏)电源的情况下进入打盹模式。不过,我不太确定你从哪里得到每 15 分钟的数据,因为我在 the behavior changes documentation 中找不到对“15”的引用。
  • @CommonsWare 感谢您的重播。我没有清楚地解释那部分,我的错误。在 setExactAndAllowWhileIdle 方法的快速文档中,声明:“在正常系统操作下,它不会超过大约每分钟发送这些警报(此时每个此类挂起的警报都会被发送);在低功耗空闲模式下,这持续时间可能会更长,例如 15 分钟”
  • 根据我的经验,在实际打盹模式下,事件之间的间隔要长得多,从一个小时到几个小时。
  • 工作日志(下载文件)似乎相隔 15 分钟。但是我现在看到下载中有例外。直到相隔 1 分钟的日志再次启动。我相信这是空闲维护模式——下载也在这里工作。不幸的是,空闲维护模式之间的间隔长达 2-4 小时。
  • 请参阅 newcircle.com/s/post/1739/2015/06/12/diving-into-android-m-doze 以更深入地了解 DeviceIdleController、它的状态和它的命令。

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


【解决方案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

顺便说一句,Doze and App Standby 上的开发者文档最近得到了改进。

【讨论】:

    【解决方案2】:

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

    在打盹模式下,您的手机会在长达 10 分钟的空闲维护期间定期唤醒。在这 10 分钟内,它将从空闲模式唤醒,您的速率限制将调整为每分钟一次。维护时段结束后,您会看到它恢复到每 15 分钟一次。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 2020-08-16
      • 2020-10-13
      • 2015-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多