tutorial studio scheduled notification manager example ejemplo android alarmmanager alarm repeating notificationmanager

android - studio - ¿Cómo detectar si una notificación ha sido desestimada?



android local notification alarmmanager (3)

¿Hay alguna forma en Android para detectar cuándo un usuario desliza una notificación a la izquierda y la elimina? Estoy usando un administrador de alarmas para configurar una alerta repetitiva y necesito que mi alerta repetitiva se detenga cuando el usuario cancele la notificación. Aquí está mi código:

Configuración de la alerta de repetición:

AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), repeatFrequency, displayIntent);

Mi código de notificación:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Get the notification ID. int notifID = getIntent().getExtras().getInt("Reminder_Primary_Key"); //Get the name of the reminder. String reminderName = getIntent().getExtras().getString("Reminder_Name"); //PendingIntent stores the Activity that should be launched when the user taps the notification. Intent i = new Intent(this, ViewLocalRemindersDetail.class); i.putExtra("NotifID", notifID); i.putExtra("notification_tap", true); //Add FLAG_ACTIVITY_NEW_TASK to stop the intent from being launched when the notification is triggered. PendingIntent displayIntent = PendingIntent.getActivity(this, notifID, i, Intent.FLAG_ACTIVITY_NEW_TASK); NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); Notification notif = new Notification(R.drawable.flag_red_large, reminderName, System.currentTimeMillis()); CharSequence from = "Here''s your reminder:"; CharSequence message = reminderName; notif.setLatestEventInfo(this, from, message, displayIntent); //Pause for 100ms, vibrate for 250ms, pause for 100ms, and vibrate for 500ms. notif.defaults |= Notification.DEFAULT_SOUND; notif.vibrate = new long[] { 100, 250, 100, 500 }; nm.notify(notifID, notif); //Destroy the activity/notification. finish(); }

Sé que necesito llamar a alarmManager.cancel(displayIntent) para cancelar mi alarma de repetición. Sin embargo, no entiendo dónde poner este código. Necesito cancelar la alerta de repetición SOLAMENTE cuando el usuario haya tocado la notificación o la haya descartado. ¡Gracias por tu ayuda!


Creo que Notification.deleteIntent es lo que está buscando. El doc dice:

La intención de ejecutar cuando la notificación es descartada explícitamente por el usuario, ya sea con el botón "Borrar todo" o barriéndolo de forma individual. Probablemente esto no debería estar iniciando una actividad ya que varios de ellos se enviarán al mismo tiempo.


Para todas esas personas futuras: puede registrar un receptor de difusión para escuchar las notificaciones de eliminación de entradas.

Crear un nuevo receptor de difusión:

public class NotificationBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action == null || !action.equals(Config.NotificationDeleteAction)) { return; } // Do some sweet stuff int x = 1; } }

Registre el receptor de difusión dentro de su clase de aplicación:

"Si su aplicación apunta al nivel de API 26 o superior, no puede usar el manifiesto para declarar un receptor para la mayoría de las difusiones implícitas (difusiones que no apuntan específicamente a su aplicación)".

Documentación de Android.

registerReceiver( new NotificationBroadcastReceiver(), new IntentFilter(Config.NotificationDeleteAction) );

Probablemente haya notado la variable estática Config.NotificationDeleteAction . Este es un identificador de cadena único para su notificación. Normalmente sigue la siguiente convención {espacio de nombres} {nombre de acción} :

you.application.namespace.NOTIFICATION_DELETE

Establezca el intento de eliminación en su creador de notificaciones:

notificationBuilder ... .setDeleteIntent(createDeleteIntent()) ...

Donde, createDeleteIntent es el siguiente método:

private PendingIntent createDeleteIntent() { Intent intent = new Intent(); intent.setAction(Config.NotificationDeleteAction); return PendingIntent.getBroadcast( context, 0, intent, PendingIntent.FLAG_ONE_SHOT ); }

Su receptor de difusión registrado debe recibir la intención cuando su notificación sea cancelada.


También puede usar un Activity PendingIntent, que puede ser más sencillo de implementar si tiene una actividad que puede manejar el despido, ya que no tiene que crear y configurar un receptor de difusión.

public static final String DELETE_TAG = "DELETE_TAG"; private PendingIntent createDeleteIntent(Context context) { Intent intent = new Intent(context, MyActivity.class); intent.putExtra(DELETE_TAG, true); return PendingIntent.getActivity( context, 0, intent, PendingIntent.FLAG_ONE_SHOT ); }

MyActivity recibiría la intención en su onCreate (), y en este ejemplo, podría buscar el DELETE_TAG extra para reconocerlo.