1

我的代码:

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 分钟的延迟(这是意料之外的)。我希望重复警报立即触发,没有任何延迟。

有人可以帮我吗?

4

1 回答 1

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 >= 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 时 :)

希望这有帮助:)

于 2015-01-04T15:43:31.310 回答