1

我有一个使用alarmsusing的应用程序AlarmManager。我在某个时间设置了一个闹钟,当它触发时,它会在 2 小时后再次设置。第二次触发警报它没有再次设置,所以它只触发了 2 次。

要知道触发的警报是第一个还是第二个,我将 aboolean作为参数传递给 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,但它也不起作用。

最终的应用程序不会经常重新安装,但如果我发布更新,这可能会导致应用程序行为出现错误。有人知道我该如何解决吗?

这是正确的操作序列(应用程序应该做什么):

1-安装应用程序。警报设置为小时 X,INFRACTION = false。

2 小时 X 到达并触发警报。接收到 INFRACTION = false的BroadcastReceiver意图,并使用 INFRACTION = true 再次设置警报。

3-重新安装应用程序。警报设置为小时 X,INFRACTION = false。由于 X 小时已经过去,警报被触发。BroadcastReceiver接收到INFRACTION = false的意图,并使用 INFRACTION = true 再次设置警报。

这是真正发生的事情:

1-安装应用程序。警报设置为小时 X,INFRACTION = false。

2 小时 X 到达并触发警报。接收到 INFRACTION = false的BroadcastReceiver意图,并使用 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);      
}

当警报被触发时,我使用上面发布的代码,在编辑之前。

[/编辑]

4

0 回答 0