So löschen Sie eine Benachrichtigung in Android


96

Ist es möglich, eine Benachrichtigung programmgesteuert zu löschen?

Ich habe es mit dem versucht, NotificationManageraber es funktioniert nicht. Kann ich das auf andere Weise tun?


12
Es ist möglich, Ihre eigenen Benachrichtigungen zu löschen, aber nicht die anderer
Donal Rafferty

1
Ja, stimme Donal für einen Code zu, siehe androidtrainningcenter.blogspot.in/2013/04/…
Tofeeq Ahmad

In dieser Antwort finden Sie eine Möglichkeit, andere Benachrichtigungen für API zu löschen> = 18 - stackoverflow.com/a/25693210/1073832
Jim Vitek

Antworten:


227

Verwenden Sie den folgenden Code, um eine Benachrichtigung abzubrechen:

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

In diesem Code wird immer dieselbe ID für Benachrichtigungen verwendet. Wenn Sie unterschiedliche Benachrichtigungen haben, die storniert werden müssen, müssen Sie die IDs speichern, die Sie zum Erstellen der Benachrichtigung verwendet haben.


9
Ich weiß nicht, warum dies nicht mehr positiv bewertet und als Antwort ausgewählt wird. Dies war die Lösung, nach der ich gesucht habe. Vielen Dank!
Loeschg

3
Wie sollte die Benachrichtigungs-ID hier lauten?
Deepak

Das funktioniert tatsächlich. Sobald ich eine Benachrichtigung storniere, wird in allen nachfolgenden Benachrichtigungen nicht der Benachrichtigungstext angezeigt (den ich mit festgelegt habe setContentText), obwohl ich die Priorität auf 2 festgelegt habe. Irgendwelche Vorschläge?
Iqbal

Funktioniert nicht, wenn das Benachrichtigungsflag als Notification.FLAG_NO_CLEAR gesetzt wurde
Anand Savjani

2
für alle und wenn Sie nicht wissen, welche ID, if (Benachrichtigungsmanager! = null) {Benachrichtigungsmanager.cancelAll (); }
Mehmet

42

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

Fügen Sie Ihrem Benachrichtigungsobjekt das Flag "FLAG_AUTO_CANCEL" hinzu, um die Statusleistenbenachrichtigung zu löschen, wenn der Benutzer sie im Benachrichtigungsfenster auswählt. Sie können es auch manuell mit cancel (int) löschen, indem Sie ihm die Benachrichtigungs-ID übergeben, oder alle Ihre Benachrichtigungen mit cancelAll () löschen.

Aber Donal hat recht, Sie können nur Benachrichtigungen löschen, die Sie erstellt haben.


11
Dadurch wird eine Benachrichtigung nicht programmgesteuert abgebrochen.
Janusz

4
Ich bin mir nicht sicher, wovon Janusz spricht, aber stornieren (id) und stornierenAlle () funktionieren auf jeden Fall
Andrew G

32

Da niemand eine Code-Antwort darauf gepostet hat:

notification.flags = Notification.FLAG_AUTO_CANCEL;

.. und wenn Sie bereits Flags haben, können Sie ODER FLAG_AUTO_CANCEL folgendermaßen vorgehen:

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

4
Es ist besser so:notifcation.flags |= Notification.FLAG_AUTO_CANCEL;
Sebastian Nowak

Könnte jemand erklären, warum es so besser ist?
Prof

@Prof Es ist weniger Code für den gleichen Zweck und hat keinen Einfluss auf die Leistung.
Denny

1
@Denny Dies setzt voraus, dass das erste Benachrichtigungsflag oben definiert ist, so dass es zwei Zeilen anstelle der einen Zeile sind
Prof

20

Bitte versuchen Sie es mit der in NotificationManager bereitgestellten Standardmethode .

NotificationManager.cancelAll()um alle Benachrichtigungen zu entfernen. NotificationManager.cancel(notificationId)bestimmte Benachrichtigung zu entfernen.


1
Falls jemand feststeckt, dass NotificationManager keine cancelMethode hat, ist die cancelMethode nicht statisch. Sie benötigen also eine Instanz NotificationManagerwie diese: NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);Dann können Sie notificationManager.cancel(notificationId);wie Rohit Suthar aufrufen, auf den in seiner Antwort verwiesen wird. notificationIdist einfach die ID, an die Sie übergeben habennotificationManager.notify(notificationId, mNotification)
Mira_Cole

8

Ab API-Level 18 (Jellybean MR2) können Sie andere Benachrichtigungen als Ihre eigenen über NotificationListenerService abbrechen.

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

Wenn Sie auf Benachrichtigung klicken, öffnen Sie die entsprechende Aktivität und entfernen Sie die Benachrichtigung aus der Benachrichtigungsleiste


4

Wenn Sie eine Benachrichtigung von einem Dienst generieren, der im Vordergrund mit gestartet wird

startForeground(NOTIFICATION_ID, notificationBuilder.build());

Dann ausstellen

notificationManager.cancel(NOTIFICATION_ID);

Die Benachrichtigung wird nicht abgebrochen, und die Benachrichtigung wird weiterhin in der Statusleiste angezeigt. In diesem speziellen Fall müssen Sie ausstellen

stopForeground( true );

aus dem Dienst heraus, um ihn wieder in den Hintergrundmodus zu versetzen und gleichzeitig die Benachrichtigungen abzubrechen. Alternativ können Sie es in den Hintergrund verschieben, ohne dass es die Benachrichtigung abbricht und dann die Benachrichtigung abbricht.

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

3

Wenn Sie NotificationCompat.Builder(einen Teil von android.support.v4) verwenden, rufen Sie einfach die Methode des Objekts aufsetAutoCancel

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

Einige Leute berichteten, dass setAutoCancel()dies für sie nicht funktioniert hat, also können Sie es auch so versuchen

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

Beachten Sie, dass die Methode getNotification()veraltet ist !!!


Bei der Frage wurde gefragt, wie es programmgesteuert gelöscht werden kann. setAutoCancel () löscht es, wenn der Benutzer auf die Benachrichtigung klickt. developer.android.com/reference/android/support/v4/app/…
S Fitz

@SFitz Aus der Frage geht nicht hervor, was er will. Ich habe verstanden, dass er die Benachrichtigung löschen möchte, wenn ein Benutzer darauf klickt.
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);

Dies funktioniert, wenn Sie einen Benachrichtigungs-Builder verwenden ...



1

Wie bereits beantwortet, bevor Sie mit API Level 18 beginnen, können Sie Benachrichtigungen, die von anderen Apps als Ihren eigenen Apps veröffentlicht wurden, mit NotificationListenerService abbrechen. Dieser Ansatz funktioniert jedoch nicht mehr mit Lollipop. Hier erfahren Sie, wie Sie Benachrichtigungen entfernen, die auch die Lillipop-API abdecken.

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

Ich kann die Methode nicht finden, cancelNotificationwas ist das?
Denny

Es ist eine Methode aus der NotificationListenerService-Klasse. Bitte überprüfen Sie die offizielle Dokumentation developer.android.com/reference/android/service/notification/…
Alejandro Casanova

Wie kann ich es außerhalb des Dienstes verwenden?
Denny

0

Alle Benachrichtigungen (auch andere App-Benachrichtigungen) können durch Abhören von 'NotificationListenerService' entfernt werden, wie in NotificationListenerService Implementation erwähnt

Im Service müssen Sie anrufen cancelAllNotifications().

Der Dienst muss für Ihre Anwendung aktiviert werden über:

'Apps & Benachrichtigungen' -> 'Spezieller App-Zugriff' -> 'Benachrichtigungszugriff'.


0

Dieser Code hat bei mir funktioniert:

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

    int notificationId = 1;
    notificationManager.cancel(notificationId);
  }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.