唤醒次数过多

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

为帮助你提升应用质量,Android 会自动监控应用是否存在唤醒闹钟次数过多的情况,并在 Android Vitals 中显示相关信息。有关数据收集方式的信息,请参阅 Play 管理中心文档

如果你的应用过度唤醒设备,你可以按照本页的指导诊断并解决问题。

解决问题

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

识别你的应用中设置唤醒闹钟的位置,并减少这些闹钟的触发频率。以下是一些提示:

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

  • 我们建议在闹钟的标签名称中包含你的软件包、类或方法名称,以便你轻松识别源代码中设置闹钟的位置。以下是一些其他提示:

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

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

adb shell dumpsys alarm

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

最佳实践

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

不要使用 AlarmManager 来安排后台任务,尤其是重复的或网络后台任务。请使用 WorkManager 来安排后台任务,因为它提供以下好处:

  • 批处理 - 作业会组合在一起,从而降低电池消耗
  • 持久性 - 如果设备重新启动,安排的 WorkManager 作业会在重新启动完成后运行
  • 条件 - 作业可以根据条件运行,例如设备是否正在充电或 WiFi 是否可用

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

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