我有一个使用alarms
使用AlarmManager
的应用程序。我在某个时间设置闹钟,当它触发时,它会在2小时后再次设置。第二次触发警报时,它不会再次设置,因此仅触发2次。
要知道触发的警报是第一个还是第二个我将boolean
作为参数传递给BroadcastReceiver,如下所示:
Bundle b = new Bundle();
b.putBoolean(TODAlarm.KEY_IS_INFRACTION, true);
Intent intent = new Intent(me, TODAlarm.class);
intent.putExtras(b);
PendingIntent pendingIntent = PendingIntent.getBroadcast(me, TODAlarm.TYPE_DAILY_REST_NEEDED,
intent, PendingIntent.FLAG_ONE_SHOT);
alarmManager.set(AlarmManager.RTC_WAKEUP, time+2*HOURS, pendingIntent);
第一次编程警报时,我将KEY_IS_INFRACTION设置为false。当它被触发时,我使用上面的代码并将其设置为true。
如果我在触发警报一次后重新启动应用程序(使用Eclipse
- >运行)(我有一个用KEY_IS_INFRACTION = true编程但尚未触发的警报)重新安装具有KEY_IS_INFRACTION = false,但BroadcastReceiver
收到的意图具有KEY_IS_INFRACTION = true(在重新安装应用程序之前,它似乎接收到编程的警报,即使我使用alarmManager.cancel)。这只发生在我重新安装应用程序时,如果我重新启动手机,收到的意图是正常的。我总是在alarmManager.set之前使用alarmManager.cancel,但它也没有用。
最终的应用程序不会经常重新安装,但如果我发布更新,可能会导致应用程序行为出错。有人知道我该如何解决它?
这是CORRECT操作序列(应用程序应该做什么):
1-安装应用程序。警报设置为小时X,INFRACTION = false。
达到2-小时X并触发警报。 BroadcastReceiver
收到INFRACTION = false的意图,并且INFRACTION = true再次设置警报。
3-重新安装应用程序。警报设置为小时X,INFRACTION = false。由于小时X已经过去,因此触发警报。 BroadcastReceiver
收到 INFRACTION = false 的意图,然后再次使用INFRACTION = true设置闹钟。
以下是它真正发生的事情:
1-安装应用程序。警报设置为小时X,INFRACTION = false。
达到2-小时X并触发警报。 BroadcastReceiver
收到INFRACTION = false的意图,并且INFRACTION = true再次设置警报。
3-重新安装应用程序。警报设置为小时X,INFRACTION = false。由于小时X已经过去,因此触发警报。 BroadcastReceiver
收到 INFRACTION = true 的意图,并且不再设置闹钟。
[编辑]添加一些代码。这是在首次启动应用程序时设置警报的功能:
private void setNeededRestAlarmOrWarning(int type, long timeToStart){
Bundle b = new Bundle();
b.putInt(TODAlarm.KEY_ALARM_TYPE, type);
if(type == TODAlarm.TYPE_DAILY_REST_NEEDED){
b.putBoolean(TODAlarm.KEY_IS_INFRACTION, arr_bControls[CONTROL_PERMITIR_DORMIR_9_HORAS] ||
arr_iControls[CONTROL_LIMIT_TO_RECUPERATE] == 0 ||
arr_iControls[CONTROL_TIME_TO_RECUPERATE_COUNTER] >= Times.CTRL_PERMITTED_DESCANSOS_REDUCIDOS_POR_SEMANA);
Log.d(TAG, "INFRACTION IS "+b.getBoolean(TODAlarm.KEY_IS_INFRACTION));
}
Intent intent = new Intent(me, TODAlarm.class);
intent.putExtras(b);
PendingIntent pendingIntent = PendingIntent.getBroadcast(me, type,
intent, PendingIntent.FLAG_ONE_SHOT);
alarmManager.set(AlarmManager.RTC_WAKEUP, timeToStart, pendingIntent);
}
当触发闹钟时,我会在编辑之前使用上面张贴的代码。
[/编辑]