Как получить и отменить PendingIntent?
У меня есть alarmManager
, который я использую для отправки уведомлений пользователю в определенное время. Поскольку существует несколько аварийных сигналов, у меня есть несколько ожидающих намерений, которые я создаю и предоставляю уникальный идентификатор. Однако есть определенные ситуации, в которых мне нужно будет получить все ожидающие намерения, а затем отменить их, поэтому я могу reset аварийные сигналы, Я пробовал это сделать, и я все еще не могу понять, что все правильно, поэтому у меня есть пара вопросов:
Это так, как вы правильно получите и отмените 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
соответствовать исходному ожидающему намерению?
Ответы
Ответ 1
Я узнал, что вы на самом деле не "получаете" ожидающее намерения... вы должны воссоздать его точно так же, как это было, когда вы его впервые создали (намерение), а затем передайте его функции отмены AlarmManager. Таким образом, вышеприведенный код, который я написал, действительно не является неправильным, если это так, как я его впервые создал. Надеюсь, кто-то найдет это полезным.
Ответ 2
Существует пример моей тестовой реализации создания и отмены тревоги.
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 вещи,
- Тот же тип намерения (в данном случае речь идет о AlarmManager).
- Идентификатор Same PendingIntent (сохраняйте ссылку на id, сохраните его каким-либо образом).
- Правильный флаг ( FLAG_CANCEL_CURRENT для отмены, нет необходимости и не должен быть именно тем, который вы использовали при создании ожидающего ответа [потому что мы используем флаг отмены для calcel, но не создаем.])
Подробнее см. этот.
Надеюсь, что это поможет.