Seit API-Level 16 (Jelly Bean) besteht die Möglichkeit, einer Benachrichtigung mit Aktionen hinzuzufügen
builder.addAction(iconId, title, intent);
Wenn ich einer Benachrichtigung jedoch eine Aktion hinzufüge und die Aktion gedrückt wird, wird die Benachrichtigung nicht abgewiesen. Wenn auf die Benachrichtigung selbst geklickt wird, kann sie mit gelöscht werden
notification.flags = Notification.FLAG_AUTO_CANCEL;
oder
builder.setAutoCancel(true);
Dies hat jedoch offensichtlich nichts mit den mit der Benachrichtigung verbundenen Aktionen zu tun.
Irgendwelche Hinweise? Oder ist dies noch nicht Teil der API? Ich habe nichts gefunden.
quelle
Es wurde festgestellt, dass dies ein Problem bei der Verwendung der Heads Up Display-Benachrichtigung von Lollipop ist. Siehe Designrichtlinien . Hier ist der vollständige (ish) Code, der implementiert werden soll.
Bisher war es weniger wichtig, einen "Entlassen" -Knopf zu haben, aber jetzt ist es mehr in Ihrem Gesicht.
Erstellen der Benachrichtigung
Benachrichtigungsaktivität
AndroidManifest.xml (Attribute, die erforderlich sind, um zu verhindern, dass sich SystemUI auf einen Backstack konzentriert)
quelle
Ich habe festgestellt, dass Sie zusätzlichen Code schreiben müssen, wenn Sie die Aktionsschaltflächen in erweiterten Benachrichtigungen verwenden, und dass Sie eingeschränkter sind.
Sie müssen Ihre Benachrichtigung manuell abbrechen, wenn der Benutzer auf eine Aktionsschaltfläche klickt. Die Benachrichtigung wird nur für die Standardaktion automatisch abgebrochen.
Auch wenn Sie einen Rundfunkempfänger über die Schaltfläche starten, wird die Benachrichtigungsleiste nicht geschlossen.
Am Ende habe ich eine neue NotificationActivity erstellt, um diese Probleme zu beheben. Diese Zwischenaktivität ohne Benutzeroberfläche bricht die Benachrichtigung ab und startet dann die Aktivität, die ich wirklich von der Benachrichtigung aus starten wollte.
Ich habe Beispielcode in einem verwandten Beitrag veröffentlicht. Durch Klicken auf Android-Benachrichtigungsaktionen wird die Benachrichtigungsschublade nicht geschlossen .
quelle
Meiner Meinung nach
BroadcastReceiver
ist die Verwendung von a eine sauberere Möglichkeit, eine Benachrichtigung abzubrechen:In AndroidManifest.xml:
In Java-Datei:
NotificationCancelReceiver
quelle
intent.putExtra()
und inBroadcastReceiver
Sie können immer
cancel()
dasNotification
von dem auswählen, was von der Aktion aufgerufen wird (z. B.onCreate()
von der Aktivität, die an die vonPendingIntent
Ihnen gelieferte Aktivität gebunden istaddAction()
).quelle
cancel()
die ID derNotification
, die Sie beim Aufruf verwendet habennotify()
. Sie brauchen dasNotification
Objekt nicht.ACTION_VIEW
und der Typ istimage/jpeg
(ein Bild mit einer anderen App zu teilen), wie soll dann dieser Abbruch ausgelöst werden? IMO Android sollte automatisch abbrechen, ich bin verwirrt, warum Android sich nicht nur darum kümmert ?!Notification
verwandten zuPendingIntent
aber so wurde sie nicht wirklich entwickelt, und so werden Sie auf Probleme wie dieses stoßen. "IMO Android sollte automatisch abgebrochen werden" - Ich konnte sehen, dass für die Aktion eine Flagge dafür angeboten wurde, aber es sollte nicht immer eine Sache sein. Wenn dies der Fall wäre, würde das Überspringen eines Titels in einer Musik-Player-Benachrichtigung die Benachrichtigung schließen.Vergessen Sie in neuen APIs nicht TAG:
und entsprechend
anstatt:
https://developer.android.com/reference/android/app/NotificationManager
quelle
cancel()
Funktion 2 Implementierungen hat; eine mit TAG und eine ohne. Aber wir müssen eine zur Verfügung stellenTAG
. Hier ist diecancel
Funktion aus Dokumentenpublic void cancel(@Nullable String tag, int id)
. Zuletzt überprüft auf Android QSetzen Sie einfach diese Zeile:
Und der vollständige Code lautet:
quelle
Sie müssen den folgenden Code ausführen, nachdem Ihre Absicht ausgelöst wurde, die Benachrichtigung zu entfernen.
NB: Benachrichtigungs-ID ist dieselbe ID, die zum Ausführen Ihrer Benachrichtigung übergeben wurde
quelle
builder.setAutoCancel (true);
Auch auf Android 9 getestet.
quelle