Aktivität aus einer Benachrichtigung starten

Wenn Sie eine Aktivität über eine Benachrichtigung starten, müssen Sie die erwartete Navigation. Durch Tippen auf die Schaltfläche „Zurück“ muss der Nutzer zurückgeleitet werden. während Sie den normalen Workflow der App zum Startbildschirm wechseln und die Seite "Letzte" muss die Aktivität als separate Aufgabe angezeigt werden. Um diese Navigation beizubehalten beginnen Sie mit einer neuen Aufgabe.

Der grundlegende Ansatz zum Festlegen des Tippverhaltens für Ihre Benachrichtigung wird unter Erstellen Sie ein Benachrichtigung. Auf dieser Seite wird beschrieben, wie Sie ein PendingIntent für Ihr Benachrichtigungsaktion, damit eine neue Aufgabe erstellt und Stack. Vorgehensweise hängt davon ab, welche Art von Aktivität Sie beginnen:

Regelmäßige Aktivität
Dies ist eine Aktivität, die Teil des normalen UX-Ablaufs Ihrer App ist. Wann? wenn der Nutzer über die Benachrichtigung zur Aktivität gelangt, muss die neue Aufgabe Fügen Sie einen vollständigen Back Stack ein, sodass Nutzende auf die Schaltfläche „Zurück“ tippen können, um zwischen ihnen zu wechseln. App-Hierarchie zu erhöhen.
Besondere Aktivität
Der Nutzer sieht diese Aktivität nur, wenn sie über eine Benachrichtigung gestartet wurde. In einer erweitert diese Aktivität die Benutzeroberfläche für Benachrichtigungen, indem in der Benachrichtigung selbst nur schwer anzuzeigen. Für diese Aktivität ist kein Back Stack ab.

Reguläre PendingIntent-Aktivität einrichten

Wenn du über deine Benachrichtigung eine normale Aktivität starten möchtest, richte PendingIntent ein mit TaskStackBuilder So wird ein neuer Back-Stack erstellt.

Aktivitätshierarchie Ihrer App definieren

Definieren Sie die natürliche Hierarchie für Ihre Aktivitäten, indem Sie die android:parentActivityName jedes <activity>-Attributs -Element in Ihrer App-Manifestdatei. 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 Back-Stack erstellen

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

Solange Sie die übergeordnete Aktivität für jede Aktivität wie beschrieben definieren können Sie uns getPendingIntent() 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 Argumente durch folgenden Aufruf hinzufügen: TaskStackBuilder.editIntentAt() Dies ist manchmal erforderlich, um sicherzustellen, dass eine Aktivität im Back-Stack werden aussagekräftige Daten angezeigt, wenn Nutzende zu diesen navigieren.

Anschließend können Sie wie gewohnt die PendingIntent 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 Aktivität PendingIntent einrichten

Weil für eine bestimmte Aktivität, die von einer Benachrichtigung ausgeht, kein Zurück können Sie den PendingIntent erstellen, indem Sie getActivity() Definieren Sie jedoch die entsprechenden Aufgabenoptionen im Manifest.

  1. Fügen Sie in Ihrem Manifest die folgenden Attribute zum <activity>-Element.
    android:taskAffinity=""
    In Kombination mit den FLAG_ACTIVITY_NEW_TASK im Code verwenden, lassen Sie dieses Attribut leer, wird diese Aktivität nicht in die Standardaufgabe der App aufgenommen. Beliebig Aufgaben, die die Standardaffinität der App haben, betroffen sind.
    android:excludeFromRecents="true"
    Schließt die neue Aufgabe vom Bildschirm „Letzte“ aus, sodass der Nutzer versehentlich wieder dorthin zurückkehren.

    Dies wird im folgenden Beispiel gezeigt:

    <activity
        android:name=".ResultActivity"
        android:launchMode="singleTask"
        android:taskAffinity=""
        android:excludeFromRecents="true">
    </activity>
    
  2. Erstellen Sie die Benachrichtigung und geben Sie sie aus: <ph type="x-smartling-placeholder">
      </ph>
    1. Erstellen Sie eine Intent, die den Activity.
    2. Legen Sie fest, dass Activity mit einer neuen, leeren Aufgabe beginnt, indem Sie Anrufen setFlags() mit den Flags FLAG_ACTIVITY_NEW_TASK und FLAG_ACTIVITY_CLEAR_TASK.
    3. Erstellen Sie ein PendingIntent, indem Sie folgenden Befehl aufrufen: getActivity().

    Dies wird im folgenden Beispiel gezeigt:

    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. Übergib 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 zum Back-Stack finden Sie unter Aufgaben und Back-Stack.