175 Stimmen

Wie man eine Benachrichtigung ausblendet, nachdem die Aktion angeklickt wurde

Seit API-Level 16 (Jelly Bean) besteht die Möglichkeit, Aktionen zu einer Benachrichtigung hinzuzufügen mit

builder.addAction(iconId, title, intent);

Aber wenn ich eine Aktion zu einer Benachrichtigung hinzufüge und die Aktion gedrückt wird, wird die Benachrichtigung nicht verworfen. Wenn auf die Benachrichtigung selbst geklickt wird, kann sie verworfen werden mit

notification.flags = Notification.FLAG_AUTO_CANCEL;

oder

builder.setAutoCancel(true);

Aber offensichtlich hat dies nichts mit den Aktionen zu tun, die mit der Benachrichtigung verknüpft sind.

Irgendwelche Hinweise? Oder ist dies noch nicht Teil der API? Ich habe nichts gefunden.

180voto

Kaediil Punkte 5395

Wenn Sie notify im Benachrichtigungsmanager aufgerufen haben, haben Sie ihm eine ID gegeben - das ist die eindeutige ID, die Sie später verwenden können, um darauf zuzugreifen (das ist vom Benachrichtigungsmanager:

notify(int id, Benachrichtigung benachrichtigung)

Um abzubrechen, würden Sie folgendes aufrufen:

cancel(int id)

mit derselben ID. Also müssen Sie im Grunde genommen die ID im Auge behalten oder möglicherweise in ein Bundle setzen, das Sie dem Intent innerhalb des PendingIntent hinzufügen?

69voto

aaronvargas Punkte 10019

Ich habe festgestellt, dass dies ein Problem darstellt, wenn die Heads-Up-Display-Benachrichtigung von Lollipop verwendet wird. Siehe Design-Richtlinien. Hier ist (ungefähr) der vollständige Code zur Implementierung.

Bislang war ein 'Abbrechen'-Button weniger wichtig, aber jetzt ist er präsenter.

Heads-Up-Benachrichtigung

Erstellen der Benachrichtigung

int notificationId = new Random().nextInt(); // einfach einen Zähler in einer Hilfsklasse verwenden...
PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, context);

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setPriority(NotificationCompat.PRIORITY_MAX) // HIGH, MAX, FULL_SCREEN und setDefaults(Notification.DEFAULT_ALL) machen es im Heads-Up-Display-Stil
        .setDefaults(Notification.DEFAULT_ALL) // erfordert auch die VIBRATE-Berechtigung
        .setSmallIcon(R.drawable.ic_action_refresh) // Erforderlich!
        .setContentTitle("Nachricht von Test")
        .setContentText("Nachricht")
        .setAutoCancel(true)
        .addAction(R.drawable.ic_action_cancel, "Abbrechen", dismissIntent)
        .addAction(R.drawable.ic_action_boom, "Aktion!", someOtherPendingIntent);

// Holt eine Instanz des NotificationManager-Dienstes
NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

// Baut die Benachrichtigung und gibt sie aus.
notifyMgr.notify(notificationId, builder.build());

NotificationActivity

public class NotificationActivity extends Activity {

    public static final String NOTIFICATION_ID = "NOTIFICATION_ID";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1));
        finish(); // da finish() in onCreate() aufgerufen wird, wird onDestroy() sofort aufgerufen
    }

    public static PendingIntent getDismissIntent(int notificationId, Context context) {
        Intent intent = new Intent(context, NotificationActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        intent.putExtra(NOTIFICATION_ID, notificationId);
        PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        return dismissIntent;
    }

}

AndroidManifest.xml (Erforderliche Attribute, um zu verhindern, dass SystemUI sich auf einen Back-Stack konzentriert)

19voto

Vicki Punkte 449

Ich habe festgestellt, dass wenn Sie die Aktionsschaltflächen in erweiterten Benachrichtigungen verwenden, müssen Sie zusätzlichen Code schreiben und sind stärker eingeschränkt.

Sie müssen Ihre Benachrichtigung manuell abbrechen, wenn der Benutzer auf eine Aktionsschaltfläche klickt. Die Benachrichtigung wird nur automatisch für die Standardaktion abgebrochen.

Außerdem, wenn Sie einen Broadcast-Empfänger über die Schaltfläche starten, schließt sich die Benachrichtigungsleiste nicht.

Ich habe schließlich eine neue NotificationActivity erstellt, um diese Probleme zu lösen. Diese zwischengeschaltete Aktivität ohne jegliche 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 gepostet Clicking Android Notification Actions does not close Notification drawer.

9voto

In meiner Meinung nach ist die Verwendung eines BroadcastReceiver ein saubererer Weg, um eine Benachrichtigung abzubrechen:

In AndroidManifest.xml:

In Java-Datei:

Intent cancel = new Intent("com.example.cancel");
PendingIntent cancelP = PendingIntent.getBroadcast(context, 0, cancel, PendingIntent.FLAG_CANCEL_CURRENT);

NotificationCompat.Action actions[] = new NotificationCompat.Action[1];

NotificationCancelReceiver

public class NotificationCancelReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //Ihre laufende Benachrichtigung abbrechen
    };
}

9voto

Malachiasz Punkte 6891

In neuen APIs nicht vergessen über TAG:

notify(String tag, int id, Notification notification)

und entsprechend

cancel(String tag, int id) 

anstatt:

cancel(int id)

https://developer.android.com/reference/android/app/NotificationManager

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X