Aktivität aus einer Benachrichtigung starten

Wenn Sie eine Aktivität aus einer Benachrichtigung starten, muss die von dem Nutzer erwartete Navigation beibehalten werden. Durch Tippen auf die Schaltfläche „Zurück“ muss der Nutzer wieder durch den normalen Workflow der App zum Startbildschirm geführt werden. Beim Öffnen des Bildschirms mit den zuletzt geöffneten Elementen muss die Aktivität als separate Aufgabe angezeigt werden. Um diese Navigation beizubehalten, beginnen Sie die Aktivität mit einer neuen Aufgabe.

Der grundlegende Ansatz zum Festlegen des Tippverhaltens für eine Benachrichtigung wird unter Grundlegende Benachrichtigung erstellen beschrieben. Auf dieser Seite wird beschrieben, wie Sie ein PendingIntent für die Aktion Ihrer Benachrichtigung einrichten, damit ein neuer Aufgabe und Backstack erstellt wird. Wie Sie dabei vorgehen, hängt davon ab, welche Art von Aktivität Sie beginnen:

Regelmäßige Aktivität
Das ist eine Aktivität, die Teil des normalen UX-Flows deiner App ist. Wenn der Nutzer zur Aktivität aus der Benachrichtigung gelangt, muss die neue Aufgabe einen vollständigen Back-Stack enthalten, sodass der Nutzer auf die Schaltfläche „Zurück“ tippen kann, um in der App-Hierarchie nach oben zu navigieren.
Besondere Aktivität
Der Nutzer sieht diese Aktivität nur, wenn sie über eine Benachrichtigung gestartet wird. Diese Aktivität erweitert die Benachrichtigungs-UI so, dass Informationen bereitgestellt werden, die in der Benachrichtigung selbst schwer anzuzeigen sind. Für diese Aktivität ist kein Back-Stack erforderlich.

Reguläre Aktivität (PendingIntent) einrichten

Wenn Sie über Ihre Benachrichtigung eine reguläre Aktivität starten möchten, richten Sie PendingIntent mit TaskStackBuilder so ein, dass ein neuer Back Stack erstellt wird. Gehen Sie dazu so vor:

Aktivitätshierarchie deiner App festlegen

Definieren Sie die natürliche Hierarchie Ihrer Aktivitäten. Fügen Sie dazu jedem <activity>-Element in Ihrer App-Manifestdatei das Attribut android:parentActivityName hinzu. Hier ein Beispiel:

<activity
    android:name=".MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<!-- MainActivity is the parent for ResultActivity. -->
<activity
    android:name=".ResultActivity"
    android:parentActivityName=".MainActivity" />
    ...
</activity>

PendingIntent mit einem Back-Stack erstellen

Um eine Aktivität zu starten, die einen Back-Stack von Aktivitäten enthält, erstellen Sie eine Instanz von TaskStackBuilder, rufen addNextIntentWithParentStack() auf und übergeben ihr den Intent für die Aktivität, die Sie starten möchten.

Solange Sie die übergeordnete Aktivität für jede Aktivität wie oben beschrieben definieren, können Sie getPendingIntent() aufrufen, um eine PendingIntent zu erhalten, die den gesamten Back-Stack enthält.

Kotlin

// Create an Intent for the activity you want to start.
val resultIntent = Intent(this, ResultActivity::class.java)
// Create the TaskStackBuilder.
val resultPendingIntent: PendingIntent? = TaskStackBuilder.create(this).run {
    // Add the intent, which inflates the back stack.
    addNextIntentWithParentStack(resultIntent)
    // Get the PendingIntent containing the entire back stack.
    getPendingIntent(0,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
}

Java

// Create an Intent for the activity you want to start.
Intent resultIntent = new Intent(this, ResultActivity.class);
// Create the TaskStackBuilder and add the intent, which inflates the back
// stack.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(resultIntent);
// Get the PendingIntent containing the entire back stack.
PendingIntent resultPendingIntent =
        stackBuilder.getPendingIntent(0,
            PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);

Bei Bedarf können Sie Intent-Objekten im Stack durch Aufrufen von TaskStackBuilder.editIntentAt() Argumente hinzufügen. Dies ist manchmal erforderlich, um sicherzustellen, dass eine Aktivität im Back-Stack aussagekräftige Daten anzeigt, wenn der Nutzer dorthin navigiert.

Anschließend können Sie PendingIntent wie gewohnt an die Benachrichtigung übergeben:

Kotlin

val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
    setContentIntent(resultPendingIntent)
    ...
}
with(NotificationManagerCompat.from(this)) {
    notify(NOTIFICATION_ID, builder.build())
}

Java

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
builder.setContentIntent(resultPendingIntent);
...
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(NOTIFICATION_ID, builder.build());

Spezielle PendingIntent-Aktivität einrichten

Da für eine spezielle Aktivität, die über eine Benachrichtigung beginnt, kein Backstack erforderlich ist, können Sie die PendingIntent durch Aufrufen von getActivity() erstellen. Definieren Sie jedoch die entsprechenden Aufgabenoptionen im Manifest.

  1. Füge in deinem Manifest dem Element <activity> die folgenden Attribute hinzu.
    android:taskAffinity=""
    Legen Sie dieses Attribut in Kombination mit dem Flag FLAG_ACTIVITY_NEW_TASK, das Sie im Code verwenden, leer, damit diese Aktivität nicht an die Standardaufgabe der App gesendet wird. Vorhandene Aufgaben mit Standardaffinität der Anwendung sind nicht betroffen.
    android:excludeFromRecents="true"
    Schließt die neue Aufgabe vom Bildschirm „Zuletzt“ aus, damit der Nutzer nicht versehentlich zu ihr zurückkehren kann.

    Dies wird im folgenden Beispiel veranschaulicht:

    <activity
        android:name=".ResultActivity"
        android:launchMode="singleTask"
        android:taskAffinity=""
        android:excludeFromRecents="true">
    </activity>
    
  2. Erstellen Sie die Benachrichtigung und geben Sie sie aus:
    1. Erstellen Sie ein Intent, das den Activity startet.
    2. Legen Sie fest, dass Activity in einer neuen, leeren Aufgabe beginnt. Rufen Sie dazu setFlags() mit den Flags FLAG_ACTIVITY_NEW_TASK und FLAG_ACTIVITY_CLEAR_TASK auf.
    3. Erstellen Sie eine PendingIntent, indem Sie getActivity() aufrufen.

    Dies wird im folgenden Beispiel veranschaulicht:

    Kotlin

    val notifyIntent = Intent(this, ResultActivity::class.java).apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
    }
    val notifyPendingIntent = PendingIntent.getActivity(
            this, 0, notifyIntent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
    )
    

    Java

    Intent notifyIntent = new Intent(this, ResultActivity.class);
    // Set the Activity to start in a new, empty task.
    notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                        | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    // Create the PendingIntent.
    PendingIntent notifyPendingIntent = PendingIntent.getActivity(
            this, 0, notifyIntent,
            PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
    );
    
  3. Übergeben Sie PendingIntent wie gewohnt an die Benachrichtigung:

    Kotlin

    val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
        setContentIntent(notifyPendingIntent)
        ...
    }
    with(NotificationManagerCompat.from(this)) {
        notify(NOTIFICATION_ID, builder.build())
    }
    

    Java

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
    builder.setContentIntent(notifyPendingIntent);
    ...
    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
    notificationManager.notify(NOTIFICATION_ID, builder.build());
    

Weitere Informationen zu den verschiedenen Aufgabenoptionen und zur Funktionsweise des Back-Stacks finden Sie unter Aufgaben und der Back-Stack.