alarms
usingを使用するアプリケーションがあります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 に達し、アラームがトリガーされます。はBroadcastReceiver
INFRACTION = false でインテントを受け取り、アラームは INFRACTION = true で再度設定されます。
3- アプリケーションを再インストールします。アラームは、INFRACTION = false で時間 X に設定されます。X 時間がすでに経過しているため、アラームがトリガーされます。はINFRACTION = falseBroadcastReceiver
でインテントを受け取り、アラームは INFRACTION = true で再度設定されます。
これが実際に起こることです:
1- アプリケーションをインストールします。アラームは、INFRACTION = false で時間 X に設定されます。
2- 時間 X に達し、アラームがトリガーされます。はBroadcastReceiver
INFRACTION = 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);
}
アラームがトリガーされたら、編集の前に上記のコードを使用します。
[/編集]