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?


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.


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ó.


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;

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.


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

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


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

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 !!!


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 ...



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

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'.


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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.