Android AlarmManager在BroadcastReceiver重新调度之前立即触发过去的警报

Android AlarmManager在BroadcastReceiver重新调度之前立即触发过去的警报,android,broadcastreceiver,alarmmanager,Android,Broadcastreceiver,Alarmmanager,我有一个BroadcastReceiver,它可以重新安排启动和时间更改等事件的警报。但是,当时间超过报警的触发时间时(例如,当用户手动更改设置中的时间时),AlarmManager会立即触发报警,然后我才能添加一天来重新安排报警。我怎样才能避免这种情况 我目前正在使用日历的set和add方法来安排警报 for (int dayOfWeek = Calendar.SUNDAY; dayOfWeek <= Calendar.SATURDAY; dayOfWeek++) {

我有一个
BroadcastReceiver
,它可以重新安排启动和时间更改等事件的警报。但是,当时间超过报警的触发时间时(例如,当用户手动更改设置中的时间时),
AlarmManager
会立即触发报警,然后我才能添加一天来重新安排报警。我怎样才能避免这种情况

我目前正在使用
日历的set和add方法来安排警报

        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;
                }
            }
        }
for(int dayOfWeek=Calendar.SUNDAY;dayOfWeek=nowDay)&&
!(dayOfWeek==nowDay&&alarm.timeHour!(dayOfWeek==nowDay&&alarm.timeHour==nowHour&&alarm.timeMinute这是有意的。请参见例如

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

还是一样

如果规定的触发时间已过,则会立即触发报警

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

if(alarmTimeStamp < System.currentTimeMillis()) {
    // if is repeating schedule in __interval__
    // else ignore
}
if(alarmTimeStamp

或者,如果日期是过去的,则忽略接收器中的报警日期/时间。

如David所述,在使用报警日期/时间之前,请预先检查报警日期/时间;如果是过去的,则在将报警日期/时间馈送至
AlarmManager
之前,请添加一秒或一分钟或其他时间


如果用户正在输入日期/时间,则以同样的方式预先检查输入。

如何创建一个用于收听时间变化的
广播接收器

清单
文件中

 <receiver android:name=".MyReceiver">
            <intent-filter >
                <action android:name="android.intent.action.TIME_SET"/>
            </intent-filter>
 </receiver>

我知道,我读过文件。但我明确希望有一种方法阻止这种情况发生。@Piyushrivastava刚刚更新了答案。你必须自己做日期检查,因为没有通用的解决方案。我已经实施了日期检查。但问题是,警报管理器甚至在我的接收器被呼叫之前触发警报。我该怎么做在此之前呼叫接收者?@Piyushrivastava您必须在添加警报之前检查日期,而不仅仅是在接收者中。我在添加警报之前检查日期。这反映在我上面发布的代码中。只有当用户手动更改时间或日期时,才会出现此问题。只有预先检查输入才是可能的如果用户更改报警时间。如果时间从设置更改,则不会。我已经在清单中添加了时间设置和日期更改操作。问题仍然存在。BroadcastReceiver onReceive在手动更改日期或时间时调用了多次,在清单中,我使用这两个作为时间设置和日期更改的意图过滤器建议您使用JobScheduler,因为您可以解决上述问题。
public class MyReceiver extends BroadcastReceiver{

    @Override 
    public void onReceive(final Context context, Intent intent) {
        Log.d("MyReceiver", "Time Changed");
        // The times have changed; so have their signs.
        updateYourAlarm();
    } 
}