para - manual de programacion android pdf
¿Cómo obtener y cancelar un PendingIntent? (2)
Descubrí que en realidad no "obtienes" el intento pendiente ... tienes que recrearlo exactamente como estaba cuando lo creaste por primera vez (Propósito también) y luego pasarlo a la función de cancelación del AlarmManager. Entonces, el código anterior que publiqué realmente no es incorrecto, siempre y cuando sea la primera vez que lo creé. Con suerte, a alguien le resultará útil.
Tengo un alarmManager
que estoy usando para enviar notificaciones al usuario en momentos específicos. Como hay varias alarmas, tengo múltiples intentos pendientes de crear y una identificación única. Sin embargo, hay ciertas situaciones en las que necesitaré obtener todos los intentos pendientes y luego cancelarlos, para poder restablecer las alarmas. Intenté hacer esto y todavía no puedo hacerlo bien, así que tengo un par de preguntas:
¿Es así como obtendrías y cancelarías correctamente un 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);
¿La intención debe coincidir exactamente con la intención original pendiente (extras y todo)?
¿ PendingIntent
indicador PendingIntent
debe coincidir con el del intento original pendiente?
Hay un ejemplo de mi implementación de prueba para crear y cancelar una alarma.
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);
}
Necesito 3 cosas,
- Mismo tipo de intención (en este caso estamos hablando de un AlarmManager ).
- La misma Id. De PendingIntent (Guarde una referencia de la identificación, guárdela de alguna manera).
- Un indicador correcto ( FLAG_CANCEL_CURRENT para cancelar, no es necesario ni debe ser exactamente el que usaste cuando creaste el pendiente [ porque utilizamos el indicador de cancelar para calcel, pero no para crear. ])
Para más detalles, mira this .
Espero eso ayude.