唤醒是 AlarmManager
API 中的一种机制,可让开发者设置闹钟以在指定时间唤醒设备。为设置唤醒闹钟,您的应用会调用 AlarmManager
中某个带有 RTC_WAKEUP
或 ELAPSED_REALTIME_WAKEUP
标志的 set()
方法。当唤醒闹钟触发时,设备会在执行闹钟的 onReceive()
或 onAlarm()
方法期间退出低功耗模式并保持部分唤醒锁定。如果唤醒闹钟触发次数过多,可能会耗尽设备的电量。
为了帮助您提高应用质量,Android 会自动监控应用是否存在过多唤醒闹钟,并在 Android Vitals 中显示相关信息。如需了解系统如何收集数据,请参阅 Play 管理中心文档。
如果您的应用唤醒设备的次数过多,您可以使用本页中的指南来诊断和解决问题。
解决问题
AlarmManager
原为
早在 Android 平台的早期版本中引入,但随着时间的推移,
以前需要
AlarmManager
现在
提供更优质的服务
WorkManager。
本部分包含有关减少唤醒闹钟的提示,但从长远来看,请考虑迁移应用,以遵循最佳实践部分中的建议。
确定您在应用中的哪些位置调度了唤醒闹钟,并降低这些闹钟的触发频率。请参考以下提示:
查找对
AlarmManager
中各种包含RTC_WAKEUP
或ELAPSED_REALTIME_WAKEUP
标志的set()
方法的调用。我们建议您在闹钟的标签名称中包含软件包、类或方法名称,以便在源代码中轻松识别设置了闹钟的位置。下面提供了更多相关提示:
- 在名称中省去任何个人身份信息 (PII),例如电子邮件地址。否则,设备将记录
_UNKNOWN
而不是闹钟名称。 - 请勿程序化地(例如通过调用
getName()
)获取类或方法名称,因为 Proguard 可能会对其进行混淆处理。您可以改用硬编码字符串。 - 请勿向闹钟标签添加计数器或唯一标识符。系统将无法汇总以这种方式设置的闹钟,因为它们都具有唯一标识符。
- 在名称中省去任何个人身份信息 (PII),例如电子邮件地址。否则,设备将记录
解决该问题后,运行以下 ADB 命令,验证唤醒闹钟是否正常运行:
adb shell dumpsys alarm
此命令提供有关设备上的闹钟系统服务状态的信息。如需了解详情,请参阅 dumpsys。
最佳实践
仅当您的应用需要执行面向用户的操作时(例如发布通知或提醒用户),才应使用唤醒闹钟。有关 AlarmManager 最佳实践的列表,请参阅调度闹钟。
请勿使用 AlarmManager
调度后台任务,特别是重复或网络后台任务。应使用 WorkManager 来调度后台任务,因为它具有以下优势:
- 批处理 - 将作业合并在一起,以减少耗电量
- 持久性 - 如果重新启动设备,调度的 WorkManager 作业会在重新启动后运行
- 条件 - 作业可以根据条件(例如设备是否正在充电或 Wi-Fi 是否可用)运行
如需了解详情,请参阅后台处理指南。
请勿使用 AlarmManager
来调度仅在应用运行期间有效的定时操作(换句话说,当用户退出应用时应取消定时操作)。在这种情况下,请使用 Handler
类,因为它更易于使用,而且效率高很多。
为您推荐
- 注意:当 JavaScript 处于关闭状态时,系统会显示链接文字
- 部分唤醒锁定操作卡住
- ANR