2

我需要在我的应用程序中进行背景检查,基本上是轮询各种 URL 以获取新内容。所以我读过这是用AlarmManager 完成的。

问题是,我不需要新东西一到就通知用户。假设我每小时检查一次,我完全可以在手机休眠时不进行任何检查,并在使用手机时恢复检查。这样用户最终会收到通知,但消耗很少。

所以我尝试了 setInExactRepeating。我在启动时启动它,但也在应用程序启动时启动它(主要用于安装后的会话,并确保它正在运行,即使应用程序被“强制终止”)。如何防止所有这些检查加起来?(只有在没有运行或需要停止前一个检查时才应运行新检查)。

4

2 回答 2

7

我发现 setInexact Repeating 与 ELAPSED_REALTIME(或 RTC)相结合可以很好地实现非常小的电池消耗。在现有的未决意图(相同的意图和 id)上使用标志 FLAG_UPDATE_CURRENT 将简单地刷新当前警报计划(如果它已经存在)。或者,添加 Ralgha 建议的代码来检查您是否已经创建了挂起的意图并设置了警报,如果没有,则设置挂起的意图和警报时间表。这两种方法对电池的影响可能相同(可以忽略不计)。会导致大量流失的原因是经常做某事。事实上,您只想每小时更新一次,而不是在屏幕关闭时更新,您的应用程序将几乎不使用任何电池(假设它的处理速度相对较快并且自行清理干净)

http://developer.android.com/reference/android/app/AlarmManager.html#ELAPSED_REALTIME

ELAPSED_REALTIME

此警报不会唤醒设备;如果它在设备睡眠时熄灭,则直到设备下次唤醒时才会发送。

http://developer.android.com/reference/android/app/AlarmManager.html#setInexactRepeating%28int,%20long,%20long,%20android.app.PendingIntent%29

setInexactRepeating

这些警报比 setRepeating(int, long, long, PendingIntent) 提供的严格重复更省电,因为系统可以调整警报的相位以使它们同时触发,避免不必要地从睡眠中唤醒设备。

http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_UPDATE_CURRENT

FLAG_UPDATE_CURRENT

...如果描述的 PendingIntent 已经存在,则保留它,但用这个新 Intent 中的内容替换其额外数据。如果您正在创建仅附加内容发生变化的意图,则可以使用此选项,并且不关心任何收到您之前的 PendingIntent 的实体将能够使用您的新附加内容启动它,即使它们没有明确提供。

于 2012-12-28T22:27:22.507 回答
1

您可以在设置警报之前检查是否已经设置了警报,还可以使用标志,以便在设备唤醒之前不会发出警报。

if ( PendingIntent.getBroadcast( context, 0, updateIntent, PendingIntent.FLAG_NO_CREATE ) == null )
{
    pendingIntent = PendingIntent.getBroadcast(context, 0, updateIntent, 0);
    getSystemService(ALARM_SERVICE).setInexactRepeating(AlarmManager.RTC,System.currentTimeMillis(),AlarmManager.INTERVAL_HOUR,pendingIntent);
}
于 2012-12-28T22:27:12.303 回答