Android重复报警管理器不立即触发

时间:2015-01-04 14:52:36

标签: android alarmmanager alarm android-alarms repeatingalarm

我的代码:

Calendar calSet = Calendar.getInstance();
calSet.set(Calendar.HOUR_OF_DAY, 11);
calSet.set(Calendar.MINUTE, 20);
calSet.set(Calendar.SECOND, 0);
calSet.set(Calendar.MILLISECOND, 0);

PendingIntent pi=PendingIntent.getBroadcast(context,0,myIntent,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP,calSet.getTimeInMillis(),pi);

并且说,我在11:30执行。警报立即触发(预期)。 但是,当我使用

时也一样
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calSet.getTimeInMillis(),24*60*60*1000,pi);

警报不会立即触发。延迟最多1分钟(这不是预期的)。 我想要立即触发重复警报而不会有任何延迟。

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

您应该将代码更改为:

PendingIntent pi=PendingIntent.getBroadcast(context,0,myIntent,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
      alarmManager.setExact(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), pi);
} else {
      alarmManager.set(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), pi);
}

<强> @Edit 上面的代码将适用于设置准确的时间。但是本节将解释重复报警管理器。

对于低于19的api,我们使用AlarmManager.setRepeating()将定期在指定时间触发警报。但是从19岁开始,这种方法再次无法工作,并且没有任何api支持这种行为。我认为这种api更改会让开发人员在创建计时器时更加谨慎。因为定时触发定时触发电池会耗费太多电量。

如果你想要,你必须自己做。首先,设置AlarmManager.setExact(),当警报触发时,您将在下次手动

时再次触发警报

以下是代码:

PendingIntent pi=PendingIntent.getBroadcast(context,0,myIntent,PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
     alarmManager. setExact(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), pi);
} else {
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(), pi);
}

在您的意图中,您放置处理代码的位置,您应该检查android api&gt; = 19,应用程序将为下一个事件创建新的警报。

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
         doSomething();
         // calculate time for next event
         Calendar nextEvent = calcNextEvent();
         // and set alarm again
         alarmManager. setExact(AlarmManager.RTC_WAKEUP, nextEvent.getTimeInMillis(), pi);
 } else {
         doSomething();
 }

我认为这是android api设计中的问题。旧代码应该适用于较新的版本。无论如何,这种新的api设计使开发人员更清楚,更适合系统(节省电池)。当然,当你使用新的api时:)

希望这有帮助:)