唤醒是 AlarmManager
API 中的一种机制,允许开发者设置闹钟在指定时间唤醒设备。你的应用通过调用 AlarmManager
中的一个 set()
方法来设置唤醒闹钟,并带上 RTC_WAKEUP
或 ELAPSED_REALTIME_WAKEUP
标志。当唤醒闹钟触发时,设备会从低功耗模式中唤醒,并在执行闹钟的 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 作业会在重新启动完成后运行
- 条件 - 作业可以根据条件运行,例如设备是否正在充电或 WiFi 是否可用
有关更多信息,请参阅后台处理指南。
不要使用 AlarmManager
来安排仅在应用运行时有效的计时操作(换句话说,当用户退出应用时,应取消计时操作)。在这种情况下,请使用 Handler
类,因为它更易于使用且效率更高。