0

我正在开发一个基于使用 AlarmManager.setAlarmClock 方法编写警报的应用程序。它主要是有效的,但在某些情况下,警报会在错误的时间引发。

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

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

结果是

  • 18:00 -> 好的
  • 18:15 -> 18:15 投掷
  • 6:00 -> 2:00 投掷!!

下面是设置闹钟的代码:

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);

任何想法为什么会发生这种情况?它在大多数情况下都可以正常工作,但有时警报无法正常工作...

谢谢!

4

1 回答 1

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 的应用程序将继续看到以前的行为,即所有警报都在请求时准确传递。

于 2018-05-14T07:52:51.787 回答