AlarmManager.setAlarmClock在错误的时间抛出警报?

时间:2018-05-14 07:38:26

标签: android calendar alarmmanager alarms

我正在使用AlarmManager.setAlarmClock方法编写基于编程警报的应用程序。它主要起作用,但在某些情况下会在错误的时间发出警报。

例如,在带有Android 5.1的三星设备中,我在以下位置设置了3个警报:

  • 18:00
  • 22:00
  • 6:00(次日)

结果是

  • 18:00 - >确定
  • 18:15 - >发生在18:15
  • 6:00 - >在2点投掷!!

以下是设置闹钟的代码:

if (Build.VERSION.SDK_INT >= 21) {
        Log.d(TAG, "Final (idle) at " + sdf.format(calendarObj.getTime()));
        AlarmManager.AlarmClockInfo info = new AlarmManager.AlarmClockInfo(calendarObj.getTimeInMillis(), pendingIntent);
        alarmManager.setAlarmClock(info, pendingIntent);
    }

这是生成“calendarObj”实例的代码(iqDate对象是具有特定日期的对象,并且根据此对象的日期设置三个警报。只需忽略它):

Calendar c1 = Calendar.getInstance();
c1.setTime(iqDate.getTime());
c1.add(Calendar.DAY_OF_MONTH, -1);
c1.set(Calendar.HOUR_OF_DAY, 18);
c1.set(Calendar.MINUTE, 0);
c1.set(Calendar.SECOND, 0);

Calendar c3 = Calendar.getInstance();
c3.setTime(iqDate.getTime());
c3.add(Calendar.DAY_OF_MONTH, -1);
c3.set(Calendar.HOUR_OF_DAY, 22);
c3.set(Calendar.MINUTE, 0);
c3.set(Calendar.SECOND, 0);

Calendar c7 = Calendar.getInstance();
c7.setTime(iqDate.getTime());
c7.set(Calendar.MINUTE, 0);
c7.set(Calendar.SECOND, 0);
c7.set(Calendar.HOUR_OF_DAY, 6);

为什么会发生这种情况?它大部分时间都有效,但有时警报不能正常工作......

谢谢!

1 个答案:

答案 0 :(得分:0)

从API 19开始(android.os.Build.VERSION_CODES.KITKAT)警报传递不准确:操作系统将移动警报以最小化唤醒和电池使用。有新的API支持需要严格交付保证的应用程序;请参阅setWindow(int,long,long,android.app.PendingIntent)和setExact(int,long,android.app.PendingIntent)。 targetSdkVersion早于API 19的应用程序将继续查看之前在请求时准确传递所有警报的行为。