请帮帮我。为什么当重复周期超过一天时,AlarmManager不能完全重复事件?
这是我运行AlarmManager的代码。变量time_period包含以下值60 * 1000 * 60 * 24 * 7,等于7天。最后,如果我更改手机上的日期,则会在6-4-7-7-7-7天内触发该事件。
这可以在应用程序的日志中看到(请参阅链接http://prntscr.com/7kdqbw)。感谢您的回复。
Intent notification = new Intent(this , ServiceReminders.class);
notification.putExtra("backup", "backup");
AlarmManager alarmManagerBackup = (AlarmManager)getSystemService(ALARM_SERVICE);
PendingIntent pibackup = PendingIntent.getService(this, 3, notification, 10);
if (sdkVersion < 19) {
alarmManagerBackup.setRepeating(AlarmManager.RTC_WAKEUP, 0, time_period, pibackup);
}
else if (sdkVersion >= 19) {
alarmManagerBackup.setInexactRepeating(AlarmManager.RTC_WAKEUP, 0, time_period, pibackup);
}
Log.d("ServiceManagerNotification", "AlarmBackup sdkVersion = "+sdkVersion);
答案 0 :(得分:1)
您通过调用setInexactRepeating()
明确利用不准确的警报。不出所料,这会导致您的警报设置不准确。
由于您提供自定义期间,问题更加复杂。如果您不使用其中一个预定义的时间间隔,那么框架只需使用您的时间间隔而不是setRepeating()
来调用setInexactRepeating()
。
来自intervalMillis
参数的文档:
后续重复警报之间的间隔(以毫秒为单位)。在API 19之前,如果这是
INTERVAL_FIFTEEN_MINUTES
,INTERVAL_HALF_HOUR
,INTERVAL_HOUR
,INTERVAL_HALF_DAY
或INTERVAL_DAY
之一,则警报将与其他警报相位对齐警报,以减少唤醒次数。否则,将设置警报,就像应用程序已调用setRepeating(int, long, long, PendingIntent)
一样。从API 19开始,所有重复警报都将是不精确的,并且无论其规定的重复间隔如何,都可以与其他警报进行批处理。
最后,无论你如何设置这个闹钟,如果你把它设置为一个重复闹钟就会不准确,而且你可以做很多事情。
如果您需要更高的精确度,则应使用setWindow()
或setExact()
并在每次警报触发时设置下一个警报。虽然如果您每周只执行一次动作,最终可能不需要那么精确。