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