1

alarmsusingを使用するアプリケーションがありますAlarmManager。特定の時刻にアラームを設定し、トリガーされると、2 時間後に再度設定されます。アラームが 2 回トリガーされると、再度設定されないため、2 回だけトリガーされます。

トリガーされたアラームが最初のアラームか 2 番目のアラームかを知るには、次のbooleanように、パラメーターとして a を 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 に設定します。

アラームが一度トリガーされたときに(->Run を使用して) アプリケーションを再インストールすると (Eclipseアラームは KEY_IS_INFRACTION = true でプログラムされていますが、まだトリガーされていません)、再インストール後にプログラムされたアラームは KEY_IS_INFRACTION = false になりますが、によって受信されたインテントにBroadcastReceiverは KEY_IS_INFRACTION = true があります (alarmManager.cancel を使用しても、アプリケーションを再インストールする前にプログラムされたアラームを受信するようです)。これは、アプリケーションを再インストールしたときにのみ発生します。電話を再起動すると、受信したインテントは問題ありません。私は常にalarmManager.setの前にalarmManager.cancelを使用していますが、どちらも機能していません。

最終的なアプリケーションは頻繁に再インストールされることはありませんが、更新を公開すると、アプリケーションの動作にエラーが発生する可能性があります。どうすれば修正できるか知っている人はいますか?

アクションの正しいシーケンスは次のとおりです (アプリケーションが何をすべきか):

1- アプリケーションをインストールします。アラームは、INFRACTION = false で時間 X に設定されます。

2- 時間 X に達し、アラームがトリガーされます。はBroadcastReceiverINFRACTION = false でインテントを受け取り、アラームは INFRACTION = true で再度設定されます。

3- アプリケーションを再インストールします。アラームは、INFRACTION = false で時間 X に設定されます。X 時間がすでに経過しているため、アラームがトリガーされます。はINFRACTION = falseBroadcastReceiverでインテントを受け取り、アラームは INFRACTION = true で再度設定されます。

これが実際に起こることです:

1- アプリケーションをインストールします。アラームは、INFRACTION = false で時間 X に設定されます。

2- 時間 X に達し、アラームがトリガーされます。はBroadcastReceiverINFRACTION = false でインテントを受け取り、アラームは INFRACTION = true で再度設定されます。

3- アプリケーションを再インストールします。アラームは、INFRACTION = false で時間 X に設定されます。X 時間がすでに経過しているため、アラームがトリガーされます。はINFRACTION = trueBroadcastReceiverのインテントを受け取り、アラームは再度設定されません。

[編集] いくつかのコードを追加します。これは、アプリケーションの最初の起動時にアラームを設定する関数です。

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