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

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

builder.addAction(iconId, title, intent); 

Pero cuando agrego una acción a una notificación y la acción se presiona, la notificación no va a ser descartada. Cuando se hace clic en la notificación en sí, se puede descartar 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 notificar al administrador de notificaciones, le di un identificador, es decir, el identificador único que puedes usar para acceder a él más tarde (esto es del administrador de notificaciones:

 notify(int id, Notification notification) 

Para cancelar, debe llamar a:

 cancel(int id) 

Con el mismo id. Por lo tanto, básicamente, usted necesita para realizar un seguimiento de la identificación o, posiblemente, poner el id en un paquete que agregar a la intención dentro de la PendingIntent?

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

Hasta ahora, tener un botón "Descartar" era menos importante, pero ahora es más en tu cara.

Notificación de cabecera

Creación de 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 a una pila trasera)

 <activity android:name=".NotificationActivity" android:taskAffinity="" android:excludeFromRecents="true"> </activity> 

Encontré que cuando usted utiliza los botones de la acción en notificaciones ampliadas, usted tiene que escribir el código adicional y usted es más constreñido.

Debe cancelar manualmente la notificación cuando el usuario hace clic en un botón de acción. La notificación sólo 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 NotificationActivity para abordar estos problemas. Esta actividad intermediaria sin ninguna interfaz de usuario cancela la notificación y luego inicia la actividad que realmente quería comenzar con la notificación.

He publicado código de ejemplo en un mensaje relacionado Al hacer clic en Acciones de notificación de Android no cierra el cajón de notificaciones .

En mi opninion usar un BroadcastReceiver es una manera más limpia de cancelar una notificación:

En AndroidManifest.xml:

 <receiver android:name=.NotificationCancelReceiver" > <intent-filter android:priority="999" > <action android:name="com.example.cancel" /> </intent-filter> </receiver> 

En java Archivo:

 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 }; } 

Siempre puede cancel() la Notification de lo que está siendo invocado por la acción (por ejemplo, en onCreate() de la actividad vinculada a la PendingIntent usted suministra a addAction() ).

  • Cómo obtener el texto de las notificaciones apiladas en Android
  • Cómo deshabilitar el botón Inicio sin utilizar TYPE_KEYGUARD?
  • Android: las notificaciones agrupadas y el resumen siguen apareciendo por separado en 4.4 y posteriores
  • Notificación de Android - RemoteServiceException
  • Fragmento no se actualizará después de la notificación de apertura
  • Android 4.3 Bluetooth ble no se llama onCharacteristicRead ()
  • ¿Por qué utilizamos TaskStackBuilder?
  • Notificación específica de Android Wear
  • Notificación de Android BigPictureStyle desaparición de texto
  • Texto Ticker NotificationCompat que no se muestra al actualizar notificación
  • ¿La actualización de una notificación elimina el estado de primer plano de un servicio?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.