Java 设置警报时出现了非常奇怪的问题

Java 设置警报时出现了非常奇怪的问题,java,android,android-intent,alarmmanager,android-alarms,Java,Android,Android Intent,Alarmmanager,Android Alarms,我在12:00、16:00和20:00设置了三个重复的每日闹钟。 但我发现第一个警报不会准时启动,而是会在11:59:34、12:00:12和12:00:56发出 我不知道为什么会发生这种情况,而且我已经阅读了很多文档,没有人给我答案。 请帮帮我 这是我的密码: //Set the Calendar Calendar cal=Calendar.getInstance(); cal.setTimeInMillis(System.currentTimeMillis()); cal.set(Calen

我在12:00、16:00和20:00设置了三个重复的每日闹钟。 但我发现第一个警报不会准时启动,而是会在11:59:34、12:00:12和12:00:56发出

我不知道为什么会发生这种情况,而且我已经阅读了很多文档,没有人给我答案。
请帮帮我

这是我的密码:

//Set the Calendar
Calendar cal=Calendar.getInstance();
cal.setTimeInMillis(System.currentTimeMillis());
cal.set(Calendar.HOUR_OF_DAY, 12);
cal.set(Calendar.MINUTE, 00);
cal.set(Calendar.SECOND, 00);

//set PendingIntent
Intent alarmIntent = new Intent(context, AlarmReceiver.class);
alarmIntent.putExtra("alarmType", 3);
PendingIntent pendingIntentMoring = PendingIntent.getBroadcast(context, 51, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pendingIntentAfternoon = PendingIntent.getBroadcast(context, 52, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent pendingIntentEvening = PendingIntent.getBroadcast(context, 53, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);

//clear the alarm manager before set the new alarm
managerMorning.cancel(pendingIntentMoring);
managerAfternoon.cancel(pendingIntentAfternoon);
managerEvening.cancel(pendingIntentEvening);


//set new alarm
managerMorning.setRepeating(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(),AlarmManager.INTERVAL_DAY, pendingIntentMoring);
managerAfternoon.setRepeating(AlarmManager.RTC_WAKEUP, cal2.getTimeInMillis(),AlarmManager.INTERVAL_DAY, pendingIntentAfternoon);
managerEvening.setRepeating(AlarmManager.RTC_WAKEUP, cal3.getTimeInMillis(),AlarmManager.INTERVAL_DAY, pendingIntentEvening);

//set Receiver
public void onReceive(Context context, Intent intent) {
    Intent myMessageintent = new Intent(context, UpDateDiaryMessage.class);
    myMessageintent.putExtra("alarmType", 3);
    context.startService(myMessageintent);
}
我已经测试过很多次了。
我无法让闹钟激活12:00:00,但我在12:00:00左右收到了两三个闹钟。
我不知道为什么它有时有效,有时无效。

根据:

注意:从API 19()开始的报警传递不准确:操作系统 将切换警报,以尽量减少唤醒和电池使用。那里 是支持需要严格交付的应用程序的新API 担保;看到和 . 应用程序
targetSdkVersion
早于API 19将继续看到 以前的行为,其中所有报警都在 请求

简而言之

  • 对于API<19,可以使用
    set()
    方法。对于这些API,这将设置一个精确的警报

  • 对于19@FrankN.Stein,我认为这必须作为一个答案发布@接受苏菲的建议。在初始化
    日历
    对象的地方发布代码。Thanx mate,你救了我!!!!让我仔细看一下官方文件。我已经添加了日历对象。Thanx mate,你救了我!!!!让我仔细看一下官方文件。我应该注意API版本并使用正确的方法。谢谢你,伙计