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?

rahul
źródło
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.

Janusz
źródło
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ś.

Chuck C.
źródło
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;
NPike
źródło
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.

Rohit Suthar
źródło
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());
}
Jim Vitek
źródło
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ń

Neeraj Singh
źródło
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);
Ian Gough
źródło
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 !!!

sandalon
źródło
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ń ...

user2962552
źródło
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());
}
Alejandro Casanova
źródło
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ń”.

Samantha
źródło
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);
  }
}
Wilson
źródło
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.

Xenolion
źródło