特定の時間にユーザーに通知を送信するために使用しているalarmManager
があります。複数のアラームがあるため、作成して一意のIDを指定する保留中のインテントが複数ありますが、保留中のインテントをすべて取得してからキャンセルする必要がある場合があります。これにより、アラームをリセットできます。私はこれを試してみましたが、それでも正しく理解できないようですので、いくつか質問があります。
これは、PendingIntent
を正しく取得してキャンセルする方法ですか?
Intent intent = new Intent(con, AppointmentNotificationReciever.class);
PendingIntent sender = PendingIntent.getBroadcast(con, id, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) con.getSystemService(Context.ALARM_SERVICE);
am.cancel(sender);
インテントは、元の保留中のインテント(エクストラおよびすべて)のインテントと正確に一致する必要がありますか?
PendingIntent
フラグは、元の保留中のインテントのフラグと一致する必要がありますか?
保留中のインテントを実際に「取得」しないことがわかりました...最初に作成したときとまったく同じように(インテントも)再作成してから、AlarmManagerのキャンセル関数に渡す必要があります。したがって、私が最初に作成した方法である限り、私が投稿した上記のコードは実際には正しくありません。うまくいけば、誰かがこれが役立つと思うでしょう。
アラームを作成してキャンセルするテスト実装の例があります。
public void setTHEalarm(Calendar aCalendarToAlarm) {
int id;
Intent intent;
PendingIntent pendingIntent;
AlarmManager alarmManager;
//I create an unique ID for my Pending Intent based on fire time of my alarm:
id = Integer.parseInt(String.format("%s%s%s%s",
aCalendarToAlarm.get(Calendar.HOUR_OF_DAY),
aCalendarToAlarm.get(Calendar.MINUTE),
aCalendarToAlarm.get(Calendar.SECOND),
aCalendarToAlarm.get(Calendar.MILLISECOND))); //HASH for ID
intent = new Intent(this,AlarmReceiver.class);
intent.putExtra("id",id); //Use the id on my intent, It would be usefull later.
//Put the id on my Pending Intent:
pendingIntent = PendingIntent.getBroadcast(this,id,intent,0);
alarmManager = (AlarmManager)
this.getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,aCalendarToAlarm.getTimeInMillis(),CustomDate.INTERVAL_MINUTE,pendingIntent);
Log.w(TAG+" Torrancio","Created alarm id: "
+id+" -> "
+CustomDate.dateToHumanString(aCalendarToAlarm.getTime()));
//Keep a reference in a previously declared field of My Activity (...)
this.idSaved = id;
}
//Now for canceling
public void setCancel() {
int id;
Intent intent;
PendingIntent pendingIntent;
AlarmManager alarmManager;
id = this.idSaved;
intent = new Intent(this,AlarmReceiver.class);
intent.putExtra("id",id);
pendingIntent = PendingIntent.getBroadcast(this,id,intent,PendingIntent.FLAG_CANCEL_CURRENT);
//Note I used FLAG_CANCEL_CURRENT
alarmManager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
Log.w(TAG+" Torrancio","Canceled->"+id);
}
3つのものが必要です、
詳細については、 this outを確認してください。
それが役に立てば幸い。