在BroadcastReceiver重新安排之前,AlarmManager会立即触发警报

Piy*_*ush 10 android broadcastreceiver alarmmanager

我有一个BroadcastReceiver重新安排启动和时间变化等事件的警报.但是当时间超过警报的触发时间时(例如,当用户手动更改设置的时间时),AlarmManager在我可以添加一天重新安排警报之前立即触发警报.我怎么能避免这个?

我目前正在使用set并添加方法Calendar来安排警报.

        for (int dayOfWeek = Calendar.SUNDAY; dayOfWeek <= Calendar.SATURDAY; dayOfWeek++) {
            if (alarm.getRepeatingDay(dayOfWeek - 1) && dayOfWeek >= nowDay &&
                    !(dayOfWeek == nowDay && alarm.timeHour < nowHour) &&
                    !(dayOfWeek == nowDay && alarm.timeHour == nowHour && alarm.timeMinute <= nowMinute)) {

                calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
                alarmSet = true;
                break;
            }
        }

        if (!alarmSet) {
            for (int dayOfWeek = Calendar.SUNDAY; dayOfWeek <= Calendar.SATURDAY; dayOfWeek++) {
                if (alarm.getRepeatingDay(dayOfWeek - 1) && dayOfWeek <= nowDay) {
                    calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
                    calendar.add(Calendar.WEEK_OF_YEAR, 1);
                    break;
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

它也在文档中说明:

如果指定的触发时间是过去的,则会立即触发警报.

如何改变这种行为?

Dav*_*jak 6

这是有意的。参见例如设置重复闹钟

一个触发时间。如果您指定的触发时间在过去,则立即触发警报。

或者在这里一样

如果规定的触发时间在过去,将立即触发警报。

为避免这种情况,您必须在添加警报之前手动检查警报,

if(alarmTimeStamp < System.currentTimeMillis()) {
    // if is repeating schedule in __interval__
    // else ignore
}
Run Code Online (Sandbox Code Playgroud)

如果日期已经过去,或者在您的接收器中忽略它们。