【问题标题】:Why does my AlarmManager trigger instantly?为什么我的 AlarmManager 会立即触发?
【发布时间】:2014-03-23 10:30:07
【问题描述】:

我希望 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 触发,但警报会立即触发

谁能告诉我为什么?

【问题讨论】:

  • 你可以在设置完所有内容后检查c.getTime(),我认为有一些错误计算。您可能需要先在日历上设置下周的 setTime(),然后再使用。
  • 如果您设置的日期已过,警报将立即触发。

标签: android scheduled-tasks alarmmanager


【解决方案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 周内首次触发,然后每周重复一次。这应该对你有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多