为什么alarmmanager不能完全重复事件android

时间:2015-06-23 16:20:33

标签: android alarmmanager

请帮帮我。为什么当重复周期超过一天时,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);

1 个答案:

答案 0 :(得分:1)

您通过调用setInexactRepeating()明确利用不准确的警报。不出所料,这会导致您的警报设置不准确。

由于您提供自定义期间,问题更加复杂。如果您不使用其中一个预定义的时间间隔,那么框架只需使用您的时间间隔而不是setRepeating()来调用setInexactRepeating()

来自intervalMillis参数的文档:

  

后续重复警报之间的间隔(以毫秒为单位)。在API 19之前,如果这是INTERVAL_FIFTEEN_MINUTESINTERVAL_HALF_HOURINTERVAL_HOURINTERVAL_HALF_DAYINTERVAL_DAY之一,则警报将与其他警报相位对齐警报,以减少唤醒次数。否则,将设置警报,就像应用程序已调用setRepeating(int, long, long, PendingIntent)一样。从API 19开始,所有重复警报都将是不精确的,并且无论其规定的重复间隔如何,都可以与其他警报进行批处理。

最后,无论你如何设置这个闹钟,如果你把它设置为一个重复闹钟就会不准确,而且你可以做很多事情。

如果您需要更高的精确度,则应使用setWindow()setExact()并在每次警报触发时设置下一个警报。虽然如果您每周只执行一次动作,最终可能不需要那么精确。