为什么我的AlarmManager会立即触发?

时间:2014-02-21 18:30:10

标签: android scheduled-tasks alarmmanager

我希望AlarmManager在预定时间(每周)重复一项任务

我使用了以下代码:

for (Integer day : daysList) {
    Calendar c = Calendar.getInstance();
    c.set(Calendar.DAY_OF_WEEK, PersonalUtils.getDigitalWeek(day));
    c.set(Calendar.HOUR_OF_DAY, task.getHour());
    c.set(Calendar.MINUTE, task.getMinute());
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MILLISECOND, 0);
    intent.putExtra("id", task.getId());
    PendingIntent operation = PendingIntent.getService(
                getApplicationContext(), requestCode, intent, 0);
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY * 7, operation);
}

但它过早地触发了警报。

例如:假设现在是星期三晚上18:30。我设置了一个应该在下周星期二17:30触发的任务,而是立即触发警报

有人可以告诉我为什么吗?

1 个答案:

答案 0 :(得分:1)

您正在尝试执行不准确的警报,该警报仅允许一些特定的常量,INTERVAL_DAYINTERVAL_FIFTEEN_MINUTES等。有关详情,请参阅Android Docs。这些常量只能用于InexactRepeatingAlarms,但我看到你在做一个RepeatingAlarm。

您有几个选择,您可以将警报设置为在1周内触发,或者您可以将其设置为每天不准确地触发,并且只有在第7天发生警报时才会注意它。要从现在开始每7天触发一次,请尝试以下操作:

final long WEEK_IN_MILLIS= 604800000;
alarm.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis()+WEEK_IN_MILLIS,
            WEEK_IN_MILLIS, operation);

请注意,我将其设置为在1周内首次触发,然后在每周后重复。这应该适合你。