唤醒是 AlarmManager
API 中的一种机制,它允许开发人员设置闹钟,以便在指定时间唤醒设备。您的应用通过调用 AlarmManager
中的 set()
方法之一(使用 RTC_WAKEUP
或 ELAPSED_REALTIME_WAKEUP
标志)来设置唤醒闹钟。当唤醒闹钟触发时,设备会从低功耗模式唤醒,并在执行闹钟的 onReceive()
或 onAlarm()
方法时保持 部分唤醒锁。如果唤醒闹钟触发过于频繁,则会导致设备电池电量消耗过快。
为了帮助您提高应用质量,Android 会自动监控应用的唤醒闹钟是否过于频繁,并在 Android 关键指标中显示相关信息。有关数据收集方式的信息,请参阅 Play Console 文档。
如果您的应用频繁唤醒设备,您可以使用本页中的指南来诊断并解决问题。
解决问题
AlarmManager
在 Android 平台早期版本中推出,但随着时间的推移,许多以前需要 AlarmManager
的用例现在可以通过 WorkManager 等新功能更好地解决。本节包含减少唤醒闹钟的提示,但从长远来看,请考虑迁移您的应用程序以遵循 最佳实践 部分中的建议。
在您的应用程序中识别您计划唤醒闹钟的位置,并减少触发这些闹钟的频率。以下是一些提示。
查找对
AlarmManager
中的各种set()
方法的调用,这些方法包含RTC_WAKEUP
或ELAPSED_REALTIME_WAKEUP
标志。我们建议在闹钟的标签名称中包含您的包、类或方法名称,以便您可以轻松识别在源代码中设置闹钟的位置。以下是一些其他提示。
- 在名称中不要包含任何个人身份信息 (PII),例如电子邮件地址。否则,设备日志会显示
_UNKNOWN
而不是闹钟名称。 - 不要以编程方式获取类或方法名称,例如通过调用
getName()
,因为 Proguard 可能对其进行混淆。而是使用硬编码字符串。 - 不要将计数器或唯一标识符添加到闹钟标签中。系统将无法汇总以这种方式设置的闹钟,因为它们都具有唯一的标识符。
- 在名称中不要包含任何个人身份信息 (PII),例如电子邮件地址。否则,设备日志会显示
修复问题后,通过运行以下 ADB 命令验证您的唤醒闹钟是否按预期工作。
adb shell dumpsys alarm
此命令提供有关设备上闹钟系统服务状态的信息。有关更多信息,请参阅 dumpsys。
最佳实践
仅当您的应用程序需要执行面向用户的操作(例如发布通知或提醒用户)时才使用唤醒闹钟。有关 AlarmManager 最佳实践的列表,请参阅 计划闹钟。
不要使用 AlarmManager
来计划后台任务,尤其是重复性或网络后台任务。使用 WorkManager 来计划后台任务,因为它提供了以下优势。
- 批处理 - 任务被合并在一起,从而减少了电池消耗。
- 持久性 - 如果设备重新启动,计划的 WorkManager 任务将在重新启动完成后运行。
- 条件 - 任务可以根据条件运行,例如设备是否正在充电或 WiFi 是否可用。
有关更多信息,请参阅 后台处理指南。
不要使用 AlarmManager
来计划仅在应用程序运行时有效的计时操作(换句话说,当用户退出应用程序时,应取消计时操作)。在这些情况下,使用 Handler
类,因为它更易于使用并且效率更高。