首页 > 解决方案 > 如果未获取唤醒锁定并且设备进入睡眠状态,哪些确切的功能会停止工作?

问题描述

在过去的几天里,我一直在试图找出当设备在没有唤醒锁定的情况下进入睡眠状态时服务中的哪些功能(后台和前台)停止工作。所有文档都只说唤醒锁“阻止 CPU 关闭”,但如果我关闭屏幕并拔下设备,我测试过的每一个功能都可以在没有唤醒锁的情况下继续工作。我还通过 adb 检查了另一个应用程序是否持有唤醒锁,但唤醒锁计数为 0。

我已经通过 MediaPlayer 类测试了 CPU 繁重的数学计算、网络请求和播放音乐。在没有唤醒锁的情况下,一切都在后台服务(在 Oreo 下方)中继续工作(网络请求在某些模拟器上有效,而在其他模拟器上无效,但无论有没有唤醒锁都是一样的)。

所以我的问题是,如果设备进入睡眠状态,哪些功能会停止在 Android 上运行?

编辑:我想明确表示我不是在谈论打瞌睡。我说的是设备进入睡眠状态并关闭 CPU,这应该在屏幕关闭并且现在获得唤醒锁定时发生。

标签: androidwakelockandroid-wake-lock

解决方案


打盹模式并不意味着设备将永久进入停止维护模式。这更像是在行动窗口之间的快速小睡。这是它的样子

Doze 为应用程序使用网络和处理未决活动提供了一个定期维护窗口。

这些是限制:

打盹限制以下限制适用于您的应用程序,而

  • 网络访问被暂停。
  • 系统忽略唤醒锁。
  • 标准 AlarmManager 警报(包括 setExact() 和 setWindow())被推迟到下一个维护窗口。
  • 如果您需要设置在打瞌睡时触发的警报,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
  • 使用 setAlarmClock() 设置的警报继续正常触发——系统在这些警报触发前不久退出打盹。
  • 系统不执行 Wi-Fi 扫描。
  • 系统不允许同步适配器运行。
  • 系统不允许 JobScheduler 运行。

来源:https ://developer.android.com/training/monitoring-device-state/doze-standby

要查看您的应用程序在打盹模式下是否仍然有效,您可以强制它。不要为此使用模拟器,而是在真实设备上尝试。

使用它来强制打盹模式

adb shell dumpsys deviceidle force-idle

取消强制

adb shell dumpsys deviceidle unforce

重置它

adb shell dumpsys battery reset

更多可以在这里找到:https ://developer.android.com/training/monitoring-device-state/doze-standby#testing_doze

另请记住,设备制造商可能会以不同方式处理打盹和待机模式。


据我所知,“睡眠模式”就是“待机模式”。您也可以通过使用以下方式强制执行此操作:

adb shell dumpsys battery unplug
adb shell am set-inactive <packageName> true

并唤醒它

adb shell am set-inactive <packageName> false
adb shell am get-inactive <packageName>

还需要注意的是,当设备正在充电时,系统会退出空闲模式。


推荐阅读