Cómo borrar una notificación en Android

96

¿Es posible borrar una notificación mediante programación?

Lo intenté con el NotificationManagerpero no funciona. ¿Hay alguna otra forma en que pueda hacerlo?

rahul
fuente
12
Es posible borrar sus propias notificaciones, pero no las de nadie más
Donal Rafferty
1
Sí, de acuerdo con Donal para un fragmento de código, ver androidtrainningcenter.blogspot.in/2013/04/…
Tofeeq Ahmad
Vea esta respuesta para ver una forma de borrar otras notificaciones para API> = 18 - stackoverflow.com/a/25693210/1073832
Jim Vitek

Respuestas:

227

Utilice el siguiente código para cancelar una notificación:

NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(NOTIFICATION_ID);

En este código siempre se usa la misma identificación para las notificaciones. Si tiene diferentes notificaciones que deben cancelarse, debe guardar los identificadores que utilizó para crear la notificación.

Janusz
fuente
9
No sé por qué esto no se vota más y se selecciona como la respuesta. Esta era la solución que estaba buscando. ¡Gracias!
loeschg
3
¿Cuál debería ser el ID de notificación aquí?
Deepak
De hecho, esto funciona. Pero una vez que cancelo una notificación, todas las notificaciones posteriores no muestran el texto del mensaje de notificación (que configuré usando setContentText), aunque configuré la prioridad en 2. ¿Alguna sugerencia?
Iqbal
No funciona si el indicador de notificación se establece como Notification.FLAG_NO_CLEAR
Anand Savjani
2
para todos y si no sabe qué id, if (notificationManager! = null) {notificationManager.cancelAll (); }
mehmet
42

De: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

Para borrar la notificación de la barra de estado cuando el usuario la selecciona en la ventana de notificaciones, agregue la bandera "FLAG_AUTO_CANCEL" a su objeto de notificación. También puede borrarlo manualmente con cancel (int), pasándole el ID de notificación o borrar todas sus Notificaciones con cancelAll ().

Pero Donal tiene razón, solo puede borrar las notificaciones que creó.

Chuck C.
fuente
11
Esto no cancelará una Notificación mediante programación.
Janusz
4
No estoy seguro de qué está hablando Janusz, pero cancelar (id) y cancelAll () ciertamente funcionan
Andrew G
32

Dado que nadie ha publicado una respuesta en código a esto:

notification.flags = Notification.FLAG_AUTO_CANCEL;

.. y si ya tienes banderas, puedes OR FLAG_AUTO_CANCEL así:

notification.flags = Notification.FLAG_INSISTENT | Notification.FLAG_AUTO_CANCEL;
NPike
fuente
4
Es mejor así:notifcation.flags |= Notification.FLAG_AUTO_CANCEL;
Sebastian Nowak
¿Alguien podría explicar por qué es mejor así?
Prof
@Prof Es menos código para el mismo propósito y no tiene ningún impacto en el rendimiento.
Denny
1
@Denny Esto asume que la primera bandera de notificación se define arriba, por lo que son dos líneas en lugar de una línea
Prof
20

Pruebe el método predeterminado proporcionado en NotificationManager .

NotificationManager.cancelAll()para eliminar todas las notificaciones. NotificationManager.cancel(notificationId)para eliminar una notificación particular.

Rohit Suthar
fuente
1
En caso de que alguien se quede atascado en NotificationManager al no tener un cancelmétodo, el cancelmétodo no es estático, por lo que necesita una instancia NotificationManagercomo esta: NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);Luego puede llamar notificationManager.cancel(notificationId);como Rohit Suthar al que se hace referencia en su respuesta. notificationIdes simplemente la identificación que notificationManager.notify(notificationId, mNotification)
ingresó
8

A partir del nivel de API 18 (Jellybean MR2), puede cancelar notificaciones que no sean las suyas a través de NotificationListenerService.

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
public class MyNotificationListenerService extends NotificationListenerService {...}

...

private void clearNotificationExample(StatusBarNotification sbn) {
    myNotificationListenerService.cancelNotification(sbn.getPackageName(), sbn.getTag(), sbn.getId());
}
Jim Vitek
fuente
5
 Notification mNotification = new Notification.Builder(this)

                .setContentTitle("A message from: " + fromUser)
                .setContentText(msg)
                .setAutoCancel(true)
                .setSmallIcon(R.drawable.app_icon)
                .setContentIntent(pIntent)
                .build();

.setAutoCancel (verdadero)

cuando hace clic en la notificación, abre la actividad correspondiente y elimina la notificación de la barra de notificaciones

Neeraj Singh
fuente
4

Si está generando una notificación desde un servicio que se inicia en primer plano usando

startForeground(NOTIFICATION_ID, notificationBuilder.build());

Luego emitiendo

notificationManager.cancel(NOTIFICATION_ID);

no termina cancelando la Notificación, y la notificación sigue apareciendo en la barra de estado. En este caso particular, deberá emitir

stopForeground( true );

desde el servicio para volver a ponerlo en segundo plano y cancelar simultáneamente las notificaciones. Alternativamente, puede colocarlo en segundo plano sin que cancele la notificación y luego cancelar la notificación.

stopForeground( false );
notificationManager.cancel(NOTIFICATION_ID);
Ian Gough
fuente
3

Si está usando NotificationCompat.Builder(una parte de android.support.v4), simplemente llame al método de su objetosetAutoCancel

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setAutoCancel(true);

Algunos chicos informaron que setAutoCancel()no funcionó para ellos, por lo que puede intentarlo de esta manera también

builder.getNotification().flags |= Notification.FLAG_AUTO_CANCEL;

Tenga en cuenta que el método getNotification()ya no se utiliza !!!

sandalias
fuente
La pregunta era cómo borrarlo mediante programación. setAutoCancel () lo borra cuando el usuario hace clic en la Notificación. developer.android.com/reference/android/support/v4/app/…
S Fitz
@SFitz No queda claro a partir de la pregunta qué es lo que quiere. Entendí que quiere borrar la notificación cuando un usuario hace clic en ella.
sandalia
1
    // Get a notification builder that's compatible with platform versions
    // >= 4
    NotificationCompat.Builder builder = new NotificationCompat.Builder(
            this);
    builder.setSound(soundUri);
    builder.setAutoCancel(true);

esto funciona si está utilizando un generador de notificaciones ...

usuario2962552
fuente
1

En realidad, como se respondió antes de comenzar con API Nivel 18, puede cancelar las notificaciones publicadas por otras aplicaciones diferentes a la suya usando NotificationListenerService, pero ese enfoque ya no funcionará en Lollipop, aquí está la forma de eliminar las notificaciones que cubren también la API de Lillipop.

if (Build.VERSION.SDK_INT < 21) {
    cancelNotification(sbn.getPackageName(), sbn.getTag(), sbn.getId());
}
else {
    cancelNotification(sbn.getKey());
}
Alejandro Casanova
fuente
No puedo encontrar el método, cancelNotification¿qué es?
Denny
Es un método de la clase NotificationListenerService, consulte la documentación oficial developer.android.com/reference/android/service/notification/…
Alejandro Casanova
¿Cómo puedo usarlo fuera del servicio?
Denny
0

Todas las notificaciones (incluso otras notificaciones de aplicaciones) se pueden eliminar escuchando 'NotificationListenerService' como se menciona en la Implementación de NotificationListenerService

En el servicio tienes que llamar cancelAllNotifications().

El servicio debe estar habilitado para su aplicación a través de:

'Aplicaciones y notificaciones' -> 'Acceso a aplicaciones especiales' -> 'Acceso a notificaciones'.

Samantha
fuente
0

este código funcionó para mí:

public class ExampleReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);

    int notificationId = 1;
    notificationManager.cancel(notificationId);
  }
}
Wilson
fuente
0

Creo que el más RECIENTE y ACTUALIZADO para AndroidX y la compatibilidad con versiones anteriores. La mejor forma de hacerlo (Kotlin y Java) debe hacerse como:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

O cancelar todas las notificaciones es:

NotificationManagerCompat.from(context).cancelAll()

Hecho para AndroidX o bibliotecas de soporte.

Xenolion
fuente