Cómo descartar la notificación después de hacer clic en la acción

Desde API nivel 16 (Jelly Bean), existe la posibilidad de agregar acciones a una notificación con

builder.addAction(iconId, title, intent); 

Pero cuando agrego una acción a una notificación y se presiona la acción, la notificación no se descarta. Cuando se hace clic en la notificación en sí, puede descartarse con

 notification.flags = Notification.FLAG_AUTO_CANCEL; 

o

 builder.setAutoCancel(true); 

Pero obviamente, esto no tiene nada que ver con las acciones asociadas a la notificación.

¿Algún consejo? ¿O esto no es parte de la API todavía? No encontré nada.

Cuando llamaste para notificar al administrador de notificaciones, le diste un id. Ese es el ID único que puedes usar para acceder a él más adelante (esto es del administrador de notificaciones:

 notify(int id, Notification notification) 

Para cancelar, llamarías:

 cancel(int id) 

con la misma identificación Entonces, básicamente, ¿necesita realizar un seguimiento de la identificación o posiblemente colocar la identificación en un paquete que agregue a la intención dentro de PendingIntent?

Se encontró que esto era un problema al usar la notificación de Heads Up Display de Lollipop. Ver las pautas de diseño . Aquí está el código completo (ish) para implementar.

Hasta ahora, tener un botón de ‘Descartar’ era menos importante, pero ahora está más en tu cara.

notificación de aviso

Construyendo la Notificación

 int notificationId = new Random().nextInt(); // just use a counter in some util class... PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, context); NotificationCompat.Builder builder = new NotificationCompat.Builder(context); builder.setPriority(NotificationCompat.PRIORITY_MAX) //HIGH, MAX, FULL_SCREEN and setDefaults(Notification.DEFAULT_ALL) will make it a Heads Up Display Style .setDefaults(Notification.DEFAULT_ALL) // also requires VIBRATE permission .setSmallIcon(R.drawable.ic_action_refresh) // Required! .setContentTitle("Message from test") .setContentText("message") .setAutoCancel(true) .addAction(R.drawable.ic_action_cancel, "Dismiss", dismissIntent) .addAction(R.drawable.ic_action_boom, "Action!", someOtherPendingIntent); // Gets an instance of the NotificationManager service NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); // Builds the notification and issues it. notifyMgr.notify(notificationId, builder.build()); 

NotificationActivity

 public class NotificationActivity extends Activity { public static final String NOTIFICATION_ID = "NOTIFICATION_ID"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1)); finish(); // since finish() is called in onCreate(), onDestroy() will be called immediately } public static PendingIntent getDismissIntent(int notificationId, Context context) { Intent intent = new Intent(context, NotificationActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); intent.putExtra(NOTIFICATION_ID, notificationId); PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); return dismissIntent; } } 

AndroidManifest.xml (atributos necesarios para evitar que SystemUI se enfoque en una stack posterior)

   

Descubrí que cuando usa los botones de acción en las notificaciones expandidas, tiene que escribir un código adicional y está más limitado.

Tiene que cancelar manualmente su notificación cuando el usuario haga clic en un botón de acción. La notificación solo se cancela automáticamente para la acción predeterminada.

Además, si inicia un receptor de difusión desde el botón, el cajón de notificaciones no se cierra.

Terminé creando una nueva actividad de notificación para abordar estos problemas. Esta actividad intermedia sin UI cancela la notificación y luego comienza la actividad que realmente quería comenzar desde la notificación.

Publiqué un código de muestra en una publicación relacionada. Al hacer clic en Acciones de notificación de Android, no cierro el Cajón de notificación .

Siempre puede cancel() la Notification de lo que sea que la acción invoca (por ejemplo, en onCreate() de la actividad vinculada al PendingIntent que suministra a addAction() ).

En mi opinión, usar un BroadcastReceiver es una manera más limpia de cancelar una Notificación:

En AndroidManifest.xml:

      

En archivo java:

 Intent cancel = new Intent("com.example.cancel"); PendingIntent cancelP = PendingIntent.getBroadcast(context, 0, cancel, PendingIntent.FLAG_CANCEL_CURRENT); NotificationCompat.Action actions[] = new NotificationCompat.Action[1]; NotificationCancelReceiver public class NotificationCancelReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //Cancel your ongoing Notification }; } 

Solo ponga esta línea:

  builder.setAutoCancel(true); 

Y el código completo es:

 NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(android.R.drawable.ic_dialog_alert); Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.co.in/")); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0); builder.setContentIntent(pendingIntent); builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.misti_ic)); builder.setContentTitle("Notifications Title"); builder.setContentText("Your notification content here."); builder.setSubText("Tap to view the website."); Toast.makeText(getApplicationContext(), "The notification has been created!!", Toast.LENGTH_LONG).show(); NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); builder.setAutoCancel(true); // Will display the notification in the notification bar notificationManager.notify(1, builder.build());