Come cancellare una notifica in Android


96

È possibile cancellare una notifica in modo programmatico?

L'ho provato con NotificationManagerma non funziona. C'è un altro modo in cui posso farlo?


12
È possibile cancellare le tue notifiche ma non quelle di chiunque altro
Donal Rafferty

1
Sì, sono d'accordo con Donal per il codice, vedere androidtrainningcenter.blogspot.in/2013/04/…
Tofeeq Ahmad

Vedi questa risposta per un modo per cancellare altre notifiche per API> = 18 - stackoverflow.com/a/25693210/1073832
Jim Vitek

Risposte:


227

Utilizza il codice seguente per annullare una notifica:

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

In questo codice c'è sempre lo stesso id usato per le notifiche. Se hai diverse notifiche che devono essere cancellate, devi salvare gli ID che hai usato per creare la notifica.


9
Non so perché questo non sia votato di più e selezionato come risposta. Questa era la soluzione che stavo cercando. Grazie!
loeschg

3
Quale dovrebbe essere l'ID di notifica qui?
Deepak

Funziona davvero. Ma una volta annullata una notifica, tutte le notifiche successive non mostrano il testo del messaggio di notifica (che ho impostato utilizzando setContentText) anche se ho impostato la priorità su 2. Qualche suggerimento?
Iqbal,

Non funziona se il flag di notifica è impostato come Notification.FLAG_NO_CLEAR
Anand Savjani

2
per tutti e se non sai quale id, if (notificationManager! = null) {notificationManager.cancelAll (); }
mehmet

42

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

Per cancellare la notifica dalla barra di stato quando l'utente la seleziona dalla finestra Notifiche, aggiungi il flag "FLAG_AUTO_CANCEL" all'oggetto Notifica. Puoi anche cancellarlo manualmente con cancel (int), passandogli l'ID di notifica o cancellare tutte le tue notifiche con cancelAll ().

Ma Donal ha ragione, puoi cancellare solo le notifiche che hai creato.


11
Ciò non annullerà una notifica a livello di programmazione.
Janusz

4
non sono sicuro di cosa stia parlando Janusz ma cancel (id) e cancelAll () funzionano sicuramente
Andrew G

32

Dal momento che nessuno ha pubblicato una risposta in codice a questo:

notification.flags = Notification.FLAG_AUTO_CANCEL;

.. e se hai già flag, puoi OR FLAG_AUTO_CANCEL in questo modo:

notification.flags = Notification.FLAG_INSISTENT | Notification.FLAG_AUTO_CANCEL;

4
È meglio così:notifcation.flags |= Notification.FLAG_AUTO_CANCEL;
Sebastian Nowak

Qualcuno potrebbe spiegare perché è meglio così?
Prof

@Prof È meno codice per lo stesso scopo e non ha alcun impatto sulle prestazioni.
Denny

1
@Denny Ciò presuppone che il primo flag di notifica sia definito sopra, quindi sono due righe invece di una riga
Prof

20

Prova il metodo predefinito fornito in NotificationManager .

NotificationManager.cancelAll()per rimuovere tutte le notifiche. NotificationManager.cancel(notificationId)per rimuovere una particolare notifica.


1
Nel caso in cui qualcuno si blocchi su NotificationManager senza un cancelmetodo, il cancelmetodo non è statico, quindi è necessaria un'istanza NotificationManagercome questa: NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);Quindi puoi chiamare notificationManager.cancel(notificationId);come Rohit Suthar a cui fa riferimento nella sua risposta. notificationIdè semplicemente l'ID a cui sei passatonotificationManager.notify(notificationId, mNotification)
Mira_Cole

8

A partire dal livello API 18 (Jellybean MR2) è possibile annullare notifiche diverse dalla propria tramite 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 (true)

quando fai clic sulla notifica, apri l'attività corrispondente e rimuovi la notifica dalla barra delle notifiche


4

Se si generano notifiche da un servizio avviato in primo piano utilizzando

startForeground(NOTIFICATION_ID, notificationBuilder.build());

Quindi emissione

notificationManager.cancel(NOTIFICATION_ID);

non finisce per annullare la notifica e la notifica appare ancora nella barra di stato. In questo caso particolare, dovrai emettere

stopForeground( true );

dall'interno del servizio per rimetterlo in background e contemporaneamente annullare le notifiche. In alternativa, puoi spostarlo in background senza dover annullare la notifica e quindi annullare la notifica.

stopForeground( false );
notificationManager.cancel(NOTIFICATION_ID);

3

Se stai usando NotificationCompat.Builder(una parte di android.support.v4), chiama semplicemente il metodo del suo oggettosetAutoCancel

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

Alcuni ragazzi stavano segnalando che setAutoCancel()non funzionava per loro, quindi puoi provare anche in questo modo

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

Nota che il metodo getNotification()è stato deprecato !!!


La domanda chiedeva come cancellarlo a livello di programmazione. setAutoCancel () lo cancella quando l'utente fa clic sulla notifica. developer.android.com/reference/android/support/v4/app/…
S Fitz

@SFitz Non è chiaro dalla domanda cosa vuole. Ho capito che vuole cancellare la notifica quando un utente fa clic su di essa.
sandalone

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

funziona se stai usando un generatore di notifiche ...



1

In realtà, come risposto prima di iniziare con il livello API 18, puoi annullare le notifiche pubblicate da altre app in modo diverso dalla tua utilizzando NotificationListenerService ma quell'approccio non funzionerà più su Lollipop, ecco il modo per rimuovere le notifiche che coprono anche l'API Lillipop.

if (Build.VERSION.SDK_INT < 21) {
    cancelNotification(sbn.getPackageName(), sbn.getTag(), sbn.getId());
}
else {
    cancelNotification(sbn.getKey());
}

Non riesco a trovare il metodo cancelNotificationche cos'è?
Denny

È un metodo della classe NotificationListenerService, controlla la documentazione ufficiale developer.android.com/reference/android/service/notification/…
Alejandro Casanova

Come posso usarlo al di fuori del servizio?
Denny

0

Tutte le notifiche (anche altre notifiche delle app) possono essere rimosse ascoltando "NotificationListenerService" come indicato in NotificationListenerService Implementation

Nel servizio devi chiamare cancelAllNotifications().

Il servizio deve essere abilitato per la tua applicazione tramite:

"App e notifiche" -> "Accesso speciale alle app" -> "Accesso alle notifiche".


0

questo codice ha funzionato per me:

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

Credo il più RECENTE e AGGIORNATO per AndroidX e compatibilità con le versioni precedenti. Il modo migliore per farlo (Kotlin e Java) dovrebbe essere fatto come:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

Oppure per annullare tutte le notifiche è:

NotificationManagerCompat.from(context).cancelAll()

Realizzato per AndroidX o librerie di supporto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.