过度唤醒

唤醒是 AlarmManager API 中的一种机制,允许开发者设置闹钟以在指定时间唤醒设备。您的应用通过使用 RTC_WAKEUPELAPSED_REALTIME_WAKEUP 标志调用 AlarmManager 中的某个 set() 方法来设置唤醒闹钟。当唤醒闹钟触发时,设备会退出低功耗模式,并在执行闹钟的 onReceive()onAlarm() 方法时保持 部分唤醒锁。如果唤醒闹钟触发过于频繁,则可能会耗尽设备的电池电量。

为了帮助您提高应用质量,Android 会自动监控应用是否存在过度唤醒闹钟,并在 Android 指标中显示相关信息。有关数据收集方式的信息,请参阅 Play 管理中心文档

如果您的应用过度唤醒设备,您可以使用本页中的指南来诊断和解决问题。

解决问题

AlarmManager 在早期版本的 Android 平台中推出,但随着时间的推移,许多以前需要 AlarmManager 的用例现在都可以通过更新的功能(如 WorkManager)更好地实现。本节包含减少唤醒闹钟的技巧,但从长远来看,请考虑迁移您的应用以遵循 最佳实践 部分中的建议。

确定应用中计划唤醒闹钟的位置,并减少触发这些闹钟的频率。以下是一些技巧:

  • 查找set()方法在AlarmManager中的各种调用,这些调用包含RTC_WAKEUPELAPSED_REALTIME_WAKEUP标志。

  • 建议在闹钟的标签名称中包含您的包、类或方法名称,以便您可以轻松识别在源代码中设置闹钟的位置。以下是一些额外的提示

    • 不要在名称中包含任何个人身份信息 (PII),例如电子邮件地址。否则,设备日志将显示_UNKNOWN而不是闹钟名称。
    • 不要以编程方式获取类或方法名称,例如通过调用getName(),因为 Proguard可能会对其进行混淆。而应使用硬编码字符串。
    • 不要向闹钟标签添加计数器或唯一标识符。系统将无法汇总以这种方式设置的闹钟,因为它们都具有唯一的标识符。

解决问题后,通过运行以下ADB命令验证唤醒闹钟是否按预期工作

adb shell dumpsys alarm

此命令提供有关设备上闹钟系统服务状态的信息。有关更多信息,请参阅dumpsys

最佳实践

仅当您的应用需要执行面向用户的操作(例如发布通知或提醒用户)时,才使用唤醒闹钟。有关 AlarmManager 最佳实践的列表,请参阅安排闹钟

不要使用AlarmManager来安排后台任务,尤其是重复性或网络后台任务。使用WorkManager来安排后台任务,因为它具有以下优点

  • 批处理 - 作业合并,从而降低电池消耗
  • 持久性 - 如果设备重新启动,则计划的 WorkManager 作业会在重新启动完成后运行
  • 条件 - 作业可以基于条件运行,例如设备是否正在充电或是否有 WiFi 可用

有关更多信息,请参阅后台处理指南

不要使用AlarmManager来安排仅在应用运行时有效的计时操作(换句话说,当用户退出应用时,应取消计时操作)。在这些情况下,使用Handler类,因为它更易于使用且效率更高。