Jak wyczyścić powiadomienie w systemie Android


97

Czy możliwe jest programowe wyczyszczenie powiadomienia?

Wypróbowałem to z, NotificationManagerale nie działa. Czy mogę to zrobić w inny sposób?


12
Możliwe jest wyczyszczenie własnych powiadomień, ale nie nikogo innego
Donal Rafferty

1
Tak, zgadzam się z Donalem w sprawie fragmentu kodu, patrz androidtrainningcenter.blogspot.in/2013/04/…
Tofeeq Ahmad

Zobacz tę odpowiedź, aby dowiedzieć się, jak wyczyścić inne powiadomienia dotyczące interfejsu API> = 18 - stackoverflow.com/a/25693210/1073832
Jim Vitek

Odpowiedzi:


227

Użyj poniższego kodu, aby anulować powiadomienie:

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

W tym kodzie zawsze znajduje się ten sam identyfikator używany do powiadomień. Jeśli masz różne powiadomienia, które należy anulować, musisz zapisać identyfikatory użyte do utworzenia powiadomienia.


9
Nie wiem, dlaczego nie jest to częściej przegłosowane i wybrane jako odpowiedź. To było rozwiązanie, którego szukałem. Dzięki!
loeschg

3
Jaki powinien być identyfikator powiadomienia?
Deepak

To rzeczywiście działa. Ale kiedy anuluję powiadomienie, wszystkie kolejne powiadomienia nie pokazują tekstu powiadomienia (który ustawiłem za pomocą setContentText), chociaż ustawiam priorytet na 2. Jakieś sugestie?
Iqbal

Nie działa, jeśli flaga powiadomienia jest ustawiona jako powiadomienie.FLAG_NO_CLEAR
Anand Savjani,

2
dla wszystkich i jeśli nie wiesz, który identyfikator, if (notificationManager! = null) {notificationManager.cancelAll (); }
mehmet

42

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

Aby wyczyścić powiadomienie na pasku stanu, gdy użytkownik wybierze je w oknie Powiadomienia, dodaj flagę „FLAG_AUTO_CANCEL” do obiektu powiadomienia. Możesz również wyczyścić go ręcznie za pomocą cancel (int), przekazując mu identyfikator powiadomienia lub wyczyścić wszystkie powiadomienia za pomocą cancelAll ().

Ale Donal ma rację, możesz wyczyścić tylko powiadomienia, które utworzyłeś.


11
Nie spowoduje to programowego anulowania powiadomienia.
Janusz

4
nie jestem pewien, o czym mówi Janusz, ale cancel (id) i cancelAll () na pewno działa
Andrew G

32

Ponieważ nikt nie opublikował odpowiedzi na to pytanie:

notification.flags = Notification.FLAG_AUTO_CANCEL;

.. a jeśli masz już flagi, możesz OR FLAG_AUTO_CANCEL w ten sposób:

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

4
Tak jest lepiej:notifcation.flags |= Notification.FLAG_AUTO_CANCEL;
Sebastian Nowak

Czy ktoś mógłby wyjaśnić, dlaczego tak jest lepiej?
Prof

@Prof To mniej kodu do tego samego celu i nie ma wpływu na wydajność.
Denny

1
@Denny Zakłada się, że pierwsza flaga powiadomienia jest zdefiniowana powyżej, więc są to dwie linie zamiast jednej linii
Prof.

21

Spróbuj domyślnej metody podanej w NotificationManager .

NotificationManager.cancelAll()aby usunąć wszystkie powiadomienia. NotificationManager.cancel(notificationId)aby usunąć konkretne powiadomienie.


1
W przypadku, gdy ktoś utknie w NotificationManager, nie mając cancelmetody, cancelmetoda nie jest statyczna, więc potrzebujesz takiej instancji NotificationManager: NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);Następnie możesz zadzwonić notificationManager.cancel(notificationId);jak Rohit Suthar, do którego odwołuje się jego odpowiedź. notificationIdto po prostu identyfikator, który przekazałeśnotificationManager.notify(notificationId, mNotification)
Mira_Cole

8

Począwszy od poziomu API 18 (Jellybean MR2) możesz anulować powiadomienia inne niż własne za pośrednictwem usługi 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)

po kliknięciu powiadomienia otwórz odpowiednią czynność i usuń powiadomienie z paska powiadomień


4

Jeśli generujesz powiadomienie z usługi, która jest uruchamiana na pierwszym planie przy użyciu

startForeground(NOTIFICATION_ID, notificationBuilder.build());

Następnie wydawanie

notificationManager.cancel(NOTIFICATION_ID);

nie kończy się anulowaniem powiadomienia, a powiadomienie nadal pojawia się na pasku stanu. W tym konkretnym przypadku będziesz musiał wydać

stopForeground( true );

z poziomu usługi, aby przełączyć ją z powrotem w tryb tła i jednocześnie anulować powiadomienia. Alternatywnie możesz umieścić go w tle bez konieczności anulowania powiadomienia, a następnie anulować powiadomienie.

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

3

Jeśli używasz NotificationCompat.Builder(części android.support.v4), po prostu wywołaj metodę obiektusetAutoCancel

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

Niektórzy faceci zgłaszali, że setAutoCancel()to nie działa, więc możesz spróbować również w ten sposób

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

Zwróć uwagę, że metoda getNotification()została wycofana !!!


Pytanie dotyczyło tego, jak wyczyścić to programowo. setAutoCancel () czyści go, gdy użytkownik kliknie powiadomienie. developer.android.com/reference/android/support/v4/app/…
S Fitz

@SFitz Z pytania nie wynika jasno, czego chce. Zrozumiałem, że chce wyczyścić powiadomienie, gdy użytkownik je kliknie.
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);

to działa, jeśli używasz konstruktora powiadomień ...



1

Właściwie, zgodnie z odpowiedzią przed rozpoczęciem od poziomu API 18, możesz anulować powiadomienia wysyłane przez inne aplikacje różniące się od Twoich własnych za pomocą NotificationListenerService, ale to podejście nie będzie już działać w Lollipop, oto sposób na usunięcie powiadomień obejmujących również Lillipop API.

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

Nie mogę znaleźć metody, cancelNotificationco to jest?
Denny

Jest to metoda z klasy NotificationListenerService, sprawdź oficjalną dokumentację developer.android.com/reference/android/service/notification/…
Alejandro Casanova

Jak mogę z niego korzystać poza usługą?
Denny,

0

Wszystkie powiadomienia (nawet inne powiadomienia aplikacji) można usunąć, nasłuchując „NotificationListenerService”, jak wspomniano w NotificationListenerService Implementation

W serwisie trzeba zadzwonić cancelAllNotifications() .

Usługa musi być włączona dla Twojej aplikacji poprzez:

„Aplikacje i powiadomienia” -> „Specjalny dostęp do aplikacji” -> „Dostęp do powiadomień”.


0

ten kod zadziałał dla mnie:

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

Uważam, że NAJNOWSZE i AKTUALIZOWANE dla AndroidX i kompatybilności wstecznej. Najlepiej zrobić to (Kotlin i Java) w następujący sposób:

NotificationManagerCompat.from(context).cancel(NOTIFICATION_ID)

Lub anulowanie wszystkich powiadomień to:

NotificationManagerCompat.from(context).cancelAll()

Stworzony dla AndroidX lub bibliotek wsparcia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.