我正在使用AlarmManager.setAlarmClock方法编写基于编程警报的应用程序。它主要起作用,但在某些情况下会在错误的时间发出警报。
例如,在带有Android 5.1的三星设备中,我在以下位置设置了3个警报:
结果是
以下是设置闹钟的代码:
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);
为什么会发生这种情况?它大部分时间都有效,但有时警报不能正常工作......
谢谢!
答案 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的应用程序将继续查看之前在请求时准确传递所有警报的行为。