在BroadcastReceiver可以重新计划之前,AlarmManager会立即触发警报

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

我目前正在使用该设置并添加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; } } } 

文件中还指出:

如果所述的触发时间在过去,则会立即触发警报。

这种行为如何改变?

Solutions Collecting From Web of "在BroadcastReceiver可以重新计划之前,AlarmManager会立即触发警报"

这是打算。 请参阅设置重复警报

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

或在这里相同

如果所述的触发时间在过去,则会立即触发警报。

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

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

或者在date过去的时候忽略它们。

正如David所说,在使用之前要预先检查报警date/时间。 如果它在过去,那么在将其馈送到AlarmManager之前,添加一秒钟或一分钟或其他。

如果用户inputdate/时间,则以相同的方式预先检查input。

如何创build一个BroadcastReceiver来监听时间变化。

Manifest文件中,

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

和您的BroadcastReceiver文件

 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(); } }