Wenn Sie eine Aktivität über eine Benachrichtigung starten, müssen Sie die erwartete Navigation des Nutzers beibehalten. Durch Tippen auf die Schaltfläche „Zurück“ muss der Nutzer über den normalen Workflow der App zum Startbildschirm zurückkehren. Wenn der Nutzer den Bildschirm „Letzte Apps“ öffnet, muss die Aktivität als separate Aufgabe angezeigt werden. Um diese Navigation beizubehalten, starten Sie die Aktivität in einer neuen Aufgabe.
Die grundlegende Vorgehensweise zum Festlegen des Tippverhaltens für Ihre Benachrichtigung wird unter Einfache Benachrichtigung erstellen beschrieben. Auf dieser Seite wird beschrieben, wie Sie einen PendingIntent für die Aktion Ihrer Benachrichtigung einrichten, damit eine neue Aufgabe und ein neuer Backstack erstellt werden. Die Vorgehensweise hängt davon ab, welche Art von Aktivität Sie starten:
- Regelmäßige Aktivität: Eine Aktivität, die Teil des normalen UX-Ablaufs Ihrer App ist. Wenn der Nutzer über die Benachrichtigung zur Aktivität gelangt, muss der neue Task einen vollständigen Backstack enthalten, damit der Nutzer über die Schaltfläche „Zurück“ in der App-Hierarchie nach oben navigieren kann.
- Spezielle Aktivität: Der Nutzer sieht diese Aktivität nur, wenn sie über eine Benachrichtigung gestartet wird. In gewisser Weise wird die Benachrichtigungs-UI durch diese Aktivität erweitert, da Informationen bereitgestellt werden, die in der Benachrichtigung selbst nur schwer angezeigt werden können. Für diese Aktivität ist kein Backstack erforderlich.
PendingIntent für eine reguläre Aktivität einrichten
Wenn Sie eine reguläre Aktivität über Ihre Benachrichtigung starten möchten, richten Sie PendingIntent mit TaskStackBuilder ein, damit ein neuer Backstack erstellt wird.
Aktivitätshierarchie Ihrer App definieren
Definieren Sie die natürliche Hierarchie für Ihre Aktivitäten, indem Sie das Attribut android:parentActivityName zu jedem <activity>-Element in der App-Manifestdatei Ihrer App hinzufügen. Siehe folgendes 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 Backstack erstellen
Wenn Sie eine Aktivität mit einem Backstack von Aktivitäten starten möchten, erstellen Sie eine Instanz von TaskStackBuilder und rufen Sie addNextIntentWithParentStack() auf. Übergeben Sie dabei die 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 einen PendingIntent mit dem gesamten Backstack zu erhalten.
// 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 ) }
Bei Bedarf können Sie Intent-Objekten im Stack Argumente hinzufügen, indem Sie TaskStackBuilder.editIntentAt() aufrufen. Das ist manchmal erforderlich, damit in einer Aktivität im Backstack aussagekräftige Daten angezeigt werden, wenn der Nutzer dorthin navigiert.
Anschließend können Sie PendingIntent wie gewohnt an die Benachrichtigung übergeben:
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(resultPendingIntent) // ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
PendingIntent für eine spezielle Aktivität einrichten
Da für eine spezielle Aktivität, die über eine Benachrichtigung gestartet wird, kein Backstack erforderlich ist, können Sie PendingIntent erstellen, indem Sie getActivity() aufrufen.
Sie müssen jedoch die entsprechenden Aufgabenoptionen im Manifest definieren.
Fügen Sie in Ihrem Manifest dem
<activity>-Element die folgenden Attribute hinzu.android:taskAffinity=""- In Kombination mit dem Flag
FLAG_ACTIVITY_NEW_TASK, das Sie im Code verwenden, muss dieses Attribut leer sein, damit diese Aktivität nicht in den Standardtask der App aufgenommen wird. Vorhandene Aufgaben mit der Standardaffinität der App sind davon nicht betroffen. android:excludeFromRecents="true"- Die neue Aufgabe wird nicht auf dem Bildschirm „Letzte“ angezeigt, damit der Nutzer nicht versehentlich dorthin zurückkehren kann.
Dies wird im folgenden Beispiel veranschaulicht:
<activity android:name=".ResultActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
Benachrichtigung erstellen und ausstellen:
- Erstellen Sie ein
Intent, dasActivitystartet. - Legen Sie die
Activityfest, um in einer neuen, leeren Aufgabe zu starten, indem SiesetFlags()mit den FlagsFLAG_ACTIVITY_NEW_TASKundFLAG_ACTIVITY_CLEAR_TASKaufrufen. - Erstellen Sie ein
PendingIntent, indem SiegetActivity()aufrufen.
Dies wird im folgenden Beispiel veranschaulicht:
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 )
- Erstellen Sie ein
Übergeben Sie
PendingIntentwie gewohnt an die Benachrichtigung:val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(notifyPendingIntent) // ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
Weitere Informationen zu den verschiedenen Aufgabenoptionen und zur Funktionsweise des Backstacks finden Sie unter Aufgaben und Backstack.