过多唤醒

唤醒是 AlarmManager API 中的一种机制,可让开发者设置闹钟以在指定时间唤醒设备。为设置唤醒闹钟,您的应用会调用 AlarmManager 中某个带有 RTC_WAKEUPELAPSED_REALTIME_WAKEUP 标记的 set() 方法。当唤醒闹钟触发时,设备会在执行闹钟的 onReceive()onAlarm() 方法期间退出低功耗模式并保持部分唤醒锁定。如果唤醒闹钟触发次数过多,则可能会耗尽设备的电池电量。

为了帮助您提高应用质量,Android 会自动监控应用是否存在过多唤醒闹钟,并在 Android Vitals 中显示相关信息。如需了解如何收集数据,请参阅 Play 管理中心文档

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

修复问题

AlarmManager 是在 Android 平台的早期版本中引入的,但随着时间的推移,许多以前需要 的用例现在都改用像 WorkManager 这样的新功能且效果更好。本部分包含有关减少唤醒闹钟的提示,但从长远来看,请考虑迁移您的应用,以遵循最佳做法部分中的建议。

确定您在应用中的哪些位置调度了唤醒闹钟,并降低这些闹钟的触发频率。请参考以下提示:

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

  • 我们建议您在闹钟的标记名称中包含您的软件包、类或方法名称,以便在源代码中轻松识别设置了闹钟的位置。下面提供了更多相关提示:

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

解决该问题后,运行以下 ADB 命令,验证唤醒闹钟是否正常运行:

adb shell dumpsys alarm
    

此命令提供有关设备上的闹钟系统服务状态的信息。如需了解详情,请参阅 dumpsys

最佳做法

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

请勿使用 AlarmManager 调度后台任务,特别是重复或网络后台任务。应使用 WorkManager 来调度后台任务,因为它具有以下优势:

  • 批处理 - 将作业合并在一起,以减少耗电量
  • 持久性 - 如果重新启动设备,则调度的 WorkManager 作业会在重新启动后运行
  • 条件 - 作业可以根据条件(例如设备是否正在充电或 WLAN 是否可用)运行

如需了解详情,请参阅后台处理指南

请勿使用 AlarmManager 来调度仅在应用运行期间有效的定时操作(换句话说,当用户退出应用时应取消定时操作)。在这种情况下,请使用 Handler 类,因为它更易于使用且效率高很多。