Android使用AlarmManager更新App Widgets的效率

Efficiency of using AlarmManager to update App Widgets in Android

我开发了一个App Widget,要求每10分钟更新一次。在 Android 关于 App Widgets 的文档中指定如果 widget 需要更新的频率超过每小时一次,建议使用 AlarmManager 并将警报类型设置为 RTC 或 ELAPSED_REALTIME 所以警报仅在设备唤醒时发出。

我已经实施了 AlarmManager,我的小部件每 10 分钟正确更新一次。经过多次测试,同时使用 RTC 和 ELAPSED_REALTIME 警报类型,我发现我的小部件在设备进入睡眠状态后仍在更新。我可以在 LogCat 中看到,即使在设备进入睡眠状态 30 分钟后(屏幕关闭后 30 分钟),我的小部件仍在更新。

我的问题是,如果警报仍然发出并且我的小部件每 10 分钟更新一次,即使在设备进入休眠状态后,如何将 AlarmManager 与 RTC 或 ELAPSED_REALTIME 一起使用,如文档所述更多电池比仅在我的小部件提供商 xml 文件上为 updatePeriodMillis 属性 设置 600,000 毫秒更有效?

几件事:

  1. RTC 和 ELAPSE_REAL_TIME 都有 WAKEUP 和非 WAKEUP 版本,所以如果你不想在 phone 休眠时更新小部件,你可以选择非 WAKEUP版本。如果您设置 updatePeriodMillis,它将以任何一种方式唤醒设备。

  2. 当您使用setInexactRepeating()而不是setRepeating()设置闹钟时,Android会捆绑多个不精确的闹钟并同时触发它们,这更电池效率。同样根据doc

    As of API 19, all repeating alarms are inexact.

  3. 另一件事是,根据AppWidgetProviderInfo doc

    Updates requested with updatePeriodMillis will not be delivered more than once every 30 minutes.

因此,如果您需要每 10 分钟更新一次,它可能对您没有用。