¿Cómo obtener y cancelar una PendingIntent?

Tengo un alarmManager que estoy utilizando para enviar notificaciones al usuario en momentos específicos. Dado que hay varias alarmas, tengo varias intenciones pendientes que estoy creando y dando una identificación única, sin embargo, hay ciertas situaciones en las que tendré que obtener todas las intenciones pendientes y luego cancelarlos, para que pueda restablecer las alarmas. He intentado hacer el suyo y todavía no puedo parecer conseguirlo derecho así que tengo un par de preguntas:

¿Es así como obtendría y cancelaría 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); 

¿Es necesario que la intención coincida exactamente con la intención pendiente original (extras y todo)?

¿ PendingIntent bandera PendingIntent necesita coincidir con la de la intención original pendiente?

Descubrí que en realidad no obtienes la intención pendiente … debes recrearla exactamente igual que cuando la creaste por primera vez (Intención también) y luego pasarla a la función de cancelación de AlarmManager. Así que el código anterior que publiqué realmente no es incorrecto, siempre y cuando thats cómo lo creé por primera vez. Esperemos que alguien encontrará esto útil.

Hay un ejemplo de mi implementación de prueba de 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); } 

Necesita 3 cosas,

  • El mismo tipo de intención (en este caso estamos hablando de un AlarmManager ).
  • Mismo ID de PendingIntent (Guarde una referencia del ID, guárdelo de alguna manera).
  • Una bandera correcta ( FLAG_CANCEL_CURRENT para cancelar, no es necesario y ni debe ser exactamente la que utilizó cuando se creó la pendiente [ porque usamos el indicador cancel para calcel, pero no crear. ])

Para más detalles por favor revise esto .

Espero eso ayude.

  • New PendingIntent actualiza la intención actual
  • ¿El mensaje de GCM se está reemplazando?
  • ¿Cómo utilizar PendingIntent para comunicarse desde un servicio a un cliente / actividad?
  • OnClick PendingIntent en widget a veces no funciona
  • ¿Cómo cancelar la tarea de repetición en el Administrador de alarmas?
  • PendingIntent obtener requestCode
  • Incorrecto timestamp en las notificaciones futuras
  • ¿Qué sucede con PendingIntents cuando se quita la aplicación?
  • Cómo abrir la página de fragmentos, cuando se presiona una notificación en android
  • Programar más de una actividad pendiente en la misma actividad con AlarmManager
  • Android Widget deja de funcionar aleatoriamente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.