Android警报:如果重新安装应用程序,传递的数据是错误的

时间:2013-04-24 11:11:43

标签: android alarmmanager reinstall

我有一个使用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);      
}

当触发闹钟时,我会在编辑之前使用上面张贴的代码。

[/编辑]

0 个答案:

没有答案