我的代码:
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分钟(这不是预期的)。 我想要立即触发重复警报而不会有任何延迟。
有人可以帮帮我吗?
答案 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时:)
希望这有帮助:)