android - 如果未获取唤醒锁定并且设备进入睡眠状态,哪些确切的功能会停止工作?
问题描述
在过去的几天里,我一直在试图找出当设备在没有唤醒锁定的情况下进入睡眠状态时服务中的哪些功能(后台和前台)停止工作。所有文档都只说唤醒锁“阻止 CPU 关闭”,但如果我关闭屏幕并拔下设备,我测试过的每一个功能都可以在没有唤醒锁的情况下继续工作。我还通过 adb 检查了另一个应用程序是否持有唤醒锁,但唤醒锁计数为 0。
我已经通过 MediaPlayer 类测试了 CPU 繁重的数学计算、网络请求和播放音乐。在没有唤醒锁的情况下,一切都在后台服务(在 Oreo 下方)中继续工作(网络请求在某些模拟器上有效,而在其他模拟器上无效,但无论有没有唤醒锁都是一样的)。
所以我的问题是,如果设备进入睡眠状态,哪些功能会停止在 Android 上运行?
编辑:我想明确表示我不是在谈论打瞌睡。我说的是设备进入睡眠状态并关闭 CPU,这应该在屏幕关闭并且现在获得唤醒锁定时发生。
解决方案
打盹模式并不意味着设备将永久进入停止维护模式。这更像是在行动窗口之间的快速小睡。这是它的样子
这些是限制:
打盹限制以下限制适用于您的应用程序,而
- 网络访问被暂停。
- 系统忽略唤醒锁。
- 标准 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>
还需要注意的是,当设备正在充电时,系统会退出空闲模式。
推荐阅读
- r - 检查R中字符串和单词向量之间的重合
- python - 使用 seaborn 将 y 轴值限制为 1 的问题
- acumatica - 如何覆盖属性内的事件处理程序?
- android - 在 Android M 的 AOSP 代码的开发人员选项中添加自定义 EditTextPreference 时出错
- java - 从现有的 android 项目中导入自己的 Android-Studio 项目中的 Java 类
- reactjs - 如何将老式(和 p、a、c、k、e、d)JavaScript 片段嵌入到 React 组件中?
- amazon-web-services - 使用 StreamConsumer 通过 Cloudformation 将 Kinesis Stream 连接到 DynamoDb 时出现问题
- jsf - PF(...) 在远程命令中使用 from onload 或 autoRun="true" 时未定义
- c - 如何分离特定数据
- sas - 使用UPDATE折叠观察时如何保留不在BY组中的变量的原始值