Od poziomu API 16 (Jelly Bean) istnieje możliwość dodawania działań do powiadomienia za pomocą
builder.addAction(iconId, title, intent);
Ale kiedy dodam akcję do powiadomienia i akcja zostanie naciśnięta, powiadomienie nie zostanie odrzucone. Po kliknięciu samego powiadomienia można je odrzucić za pomocą
notification.flags = Notification.FLAG_AUTO_CANCEL;
lub
builder.setAutoCancel(true);
Ale oczywiście nie ma to nic wspólnego z działaniami związanymi z powiadomieniem.
Jakieś wskazówki? A może nie jest to jeszcze część API? Nic nie znalazłem.
źródło
Okazało się, że jest to problem podczas korzystania z powiadomienia Heads Up Display firmy Lollipop. Zobacz wytyczne projektowe . Oto kompletny kod do zaimplementowania.
Do tej pory posiadanie przycisku „Odrzuć” było mniej ważne, ale teraz jest bardziej widoczne.
Tworzenie powiadomienia
NotificationActivity
AndroidManifest.xml (atrybuty wymagane, aby uniemożliwić SystemUI skupienie się na stosie wstecznym)
źródło
Odkryłem, że kiedy używasz przycisków akcji w rozszerzonych powiadomieniach, musisz napisać dodatkowy kod i jesteś bardziej ograniczony.
Musisz ręcznie anulować powiadomienie, gdy użytkownik kliknie przycisk akcji. Powiadomienie jest anulowane automatycznie tylko dla domyślnej akcji.
Również jeśli uruchomisz odbiornik transmisji za pomocą przycisku, szuflada powiadomień nie zamknie się.
Skończyło się na utworzeniu nowego NotificationActivity, aby rozwiązać te problemy. Ta pośrednia czynność bez interfejsu użytkownika anuluje powiadomienie, a następnie rozpoczyna działanie, które naprawdę chciałem rozpocząć od powiadomienia.
Wysłałem przykładowy kod w powiązanym poście. Kliknięcie akcji powiadomień systemu Android nie zamyka szuflady powiadomień .
źródło
Zawsze możesz
cancel()
pochodzićNotification
z tego, co jest wywoływane przez działanie (np. WonCreate()
działaniu powiązanym zPendingIntent
dostawąaddAction()
).źródło
cancel()
pobiera identyfikatorNotification
, którego użyłeś, gdy dzwoniłeśnotify()
. Nie potrzebujeszNotification
obiektu.ACTION_VIEW
a typ toimage/jpeg
(udostępnienie obrazu innej aplikacji), to w jaki sposób ma zostać wywołane anulowanie? IMO Android powinien automatycznie anulować, zastanawiam się, dlaczego Android nie tylko się tym zajmuje ?!Notification
powiązanej z nią aplikacjiPendingIntent
, tak naprawdę nie została zaprojektowana do działania, więc napotkasz problemy takie jak ten. „IMO Android powinien automatycznie anulować” - widziałem oferowanie flagi oznaczającej to w akcji, ale nie powinno to być ciągłe. Gdyby tak było, pominięcie utworu w powiadomieniu odtwarzacza muzyki spowodowałoby zamknięcie powiadomienia.Moim zdaniem użycie
BroadcastReceiver
jest czystszym sposobem na anulowanie powiadomienia:W AndroidManifest.xml:
W pliku java:
NotificationCancelReceiver
źródło
intent.putExtra()
i dostać goBroadcastReceiver
W nowych API nie zapomnij o TAG:
i odpowiednio
zamiast:
https://developer.android.com/reference/android/app/NotificationManager
źródło
cancel()
funkcja ma 2 implementacje; jeden z TAG i jeden bez. Ale musimy zapewnić plikTAG
. Otocancel
funkcja z docspublic void cancel(@Nullable String tag, int id)
. Ostatnio sprawdzane na Androidzie QPo prostu umieść tę linię:
A pełny kod to:
źródło
Będziesz musiał uruchomić następujący kod po uruchomieniu zamiaru, aby usunąć powiadomienie.
NB: notificationId to ten sam identyfikator przekazany do uruchomienia powiadomienia
źródło
builder.setAutoCancel (true);
Testowany również na Androidzie 9.
źródło