Aufgaben und der Back Stack

Eine Aufgabe ist eine Sammlung von Aktivitäten, mit denen Nutzer interagieren, wenn sie versuchen, etwas in Ihrer App zu tun. Diese Aktivitäten sind in einem Stack, dem Back Stack, in der Reihenfolge angeordnet, in der die einzelnen Aktivitäten geöffnet werden.

Beispielsweise kann eine E-Mail-App eine Aktivität haben, um eine Liste neuer Nachrichten anzuzeigen. Wenn der Nutzer eine Nachricht auswählt, wird eine neue Aktivität geöffnet, in der diese Nachricht angezeigt wird. Diese neue Aktivität wird dem Back-Stack hinzugefügt. Wenn der Nutzer dann tippt oder auf „Zurück“ tippt, wird die neue Aktivität beendet und vom Stapel entfernt.

Lebenszyklus einer Aufgabe und ihres Back-Stacks

Der Startbildschirm des Geräts ist der Ausgangspunkt für die meisten Aufgaben. Wenn ein Nutzer das Symbol für eine App oder Verknüpfung im App Launcher oder auf dem Startbildschirm berührt, wird die Aufgabe dieser App in den Vordergrund gestellt. Wenn für die Anwendung keine Aufgabe vorhanden ist, wird eine neue Aufgabe erstellt und die Hauptaktivität für diese Anwendung wird als Stammaktivität im Stack geöffnet.

Wenn die aktuelle Aktivität eine weitere beginnt, wird die neue Aktivität an den Anfang des Stapels verschoben und nimmt den Fokus auf. Die vorherige Aktivität bleibt im Stack, wird aber beendet. Wenn eine Aktivität gestoppt wird, behält das System den aktuellen Status der Benutzeroberfläche bei. Wenn der Nutzer die Zurück-Aktion ausführt, wird die aktuelle Aktivität vom Anfang des Stapels gehoben und gelöscht. Die vorherige Aktivität wird fortgesetzt und der vorherige Status der UI wird wiederhergestellt.

Aktivitäten im Stapel werden nie neu angeordnet, sondern nur dann auf den Stapel verschoben und daraus entfernt, wenn sie von der aktuellen Aktivität gestartet und vom Nutzer über die Schaltfläche „Zurück“ oder die Touch-Geste „Zurück“ geschlossen werden. Daher funktioniert der Back-Stack als Last-In-First-Out-Objektstruktur. Abbildung 1 zeigt eine Zeitachse mit Aktivitäten, die auf einen Back Stack geschoben und aus diesem herausgebracht werden.

Abbildung 1: Eine Darstellung dessen, wie bei jeder neuen Aktivität in einer Aufgabe ein Element zum Back Stack hinzugefügt wird. Wenn der Nutzer darauf tippt oder auf „Zurück“ tippt, wird die aktuelle Aktivität gelöscht und die vorherige Aktivität wird fortgesetzt.

Wenn der Nutzer weiter tippt oder die Geste „Zurück“ tippt, wird jede Aktivität im Stapel geöffnet, um die vorherige Aktivität anzuzeigen, bis der Nutzer zum Startbildschirm zurückkehrt oder zu der Aktivität zurückkehrt, die zu Beginn der Aufgabe ausgeführt wurde. Wenn alle Aktivitäten aus dem Stack entfernt wurden, ist die Aufgabe nicht mehr vorhanden.

Verhalten beim Zurücktippen bei Root Launcher-Aktivitäten

Stamm-Launcher-Aktivitäten sind Aktivitäten, die mit ACTION_MAIN und CATEGORY_LAUNCHER einen Intent-Filter deklarieren. Diese Aktivitäten sind eindeutig, da sie vom App Launcher aus als Einstiegspunkte zu Ihrer App fungieren und zum Starten einer Aufgabe verwendet werden.

Wenn ein Nutzer von einer Root-Launcher-Aktivität aus auf das Display tippt oder auf „Zurück“ tippt, behandelt das System das Ereignis abhängig von der Android-Version, auf der das Gerät ausgeführt wird, unterschiedlich.

Systemverhalten unter Android 11 und niedriger
Das System schließt die Aktivität ab.
Systemverhalten unter Android 12 und höher

Das System verschiebt die Aktivität und ihre Aufgabe in den Hintergrund, anstatt die Aktivität abzuschließen. Dieses Verhalten entspricht dem Standardverhalten des Systems, wenn Sie eine App über die Startbildschirmtaste oder Touch-Geste verlassen.

In den meisten Fällen bedeutet dieses Verhalten, dass Nutzer Ihre App im warmen Zustand schneller fortsetzen können, anstatt sie vollständig aus einem kalten Zustand neu zu starten.

Wenn Sie benutzerdefinierte Zurück-Navigation bereitstellen müssen, empfehlen wir die Verwendung der AndroidX Activity APIs, anstatt onBackPressed() zu überschreiben. Die AndroidX Activity APIs wenden sich automatisch an das entsprechende Systemverhalten an, wenn keine Komponenten das Systemrücktippen abfangen.

Wenn Ihre Anwendung jedoch onBackPressed() überschreibt, um die Zurück-Navigation zu verarbeiten und die Aktivität abzuschließen, aktualisieren Sie Ihre Implementierung so, dass sie zu super.onBackPressed() führt, anstatt den Vorgang abzuschließen. Durch den Aufruf von super.onBackPressed() werden die Aktivität und die zugehörige Aufgabe gegebenenfalls in den Hintergrund verschoben. So wird den Nutzern in allen Apps eine einheitlichere Navigation ermöglicht.

Aufgaben im Hintergrund und im Vordergrund

Abbildung 2: Zwei Aufgaben: Aufgabe B empfängt Nutzerinteraktionen im Vordergrund, während Aufgabe A im Hintergrund ausgeführt wird und darauf wartet, dass sie fortgesetzt wird.

Eine Aufgabe ist eine zusammenhängende Einheit, die in den Hintergrund verschoben werden kann, wenn ein Nutzer eine neue Aufgabe beginnt oder den Startbildschirm aufruft. Während sie im Hintergrund ausgeführt wird, werden alle Aktivitäten in der Aufgabe angehalten, aber der Back Stack für die Aufgabe bleibt intakt. Die Aufgabe verliert den Fokus, während eine andere Aufgabe stattfindet (siehe Abbildung 2). Eine Aufgabe kann dann in den Vordergrund zurückkehren, damit Nutzer dort weitermachen können, wo sie aufgehört haben.

Betrachten Sie den folgenden Aufgabenfluss für die aktuelle Aufgabe A mit drei Aktivitäten im Stapel, davon zwei unter der aktuellen Aktivität:

  1. Der Nutzer verwendet die Startbildschirmtaste oder Touch-Geste und startet dann eine neue App über den App Launcher.

    Wenn der Startbildschirm erscheint, wird Aufgabe A in den Hintergrund verschoben. Wenn die neue Anwendung gestartet wird, startet das System eine Aufgabe für diese Anwendung (Aufgabe B) mit einem eigenen Aktivitätsstapel.

  2. Nach der Interaktion mit dieser App kehrt der Nutzer zur Startseite zurück und wählt die App aus, die Aufgabe A ursprünglich gestartet hat.

    Jetzt kommt Aufgabe A in den Vordergrund – alle drei Aktivitäten im Stack sind intakt und die Aktivität oben im Stack wird fortgesetzt. An dieser Stelle kann der Nutzer auch zurück zu Aufgabe B wechseln. Dazu gehen Sie auf den Startbildschirm und wählen das App-Symbol aus, mit dem die Aufgabe gestartet wurde, oder indem Sie die Aufgabe der App auf dem Bildschirm Zuletzt verwendet auswählen.

Mehrere Aktivitätsinstanzen

Abbildung 3: Eine einzelne Aktivität kann mehrmals instanziiert werden.

Da die Aktivitäten im Back-Stack niemals neu angeordnet werden, wird eine neue Instanz dieser Aktivität erstellt und in den Stack verschoben, wenn Ihre Anwendung Nutzern ermöglicht, eine bestimmte Aktivität aus mehr als einer Aktivität zu starten. Daher kann eine Aktivität in Ihrer App mehrmals instanziiert werden, auch von verschiedenen Aufgaben aus, wie in Abbildung 3 dargestellt.

Wenn der Nutzer mit der Schaltfläche „Zurück“ oder mit der Touch-Geste rückwärts navigiert, werden die Instanzen der Aktivität in der Reihenfolge angezeigt, in der sie geöffnet wurden, und zwar jeweils mit einem eigenen UI-Status. Sie können dieses Verhalten jedoch ändern, wenn Sie nicht möchten, dass eine Aktivität mehr als einmal instanziiert wird. Weitere Informationen dazu finden Sie im Abschnitt zum Verwalten von Aufgaben.

Mehrfenster-Umgebungen

Wenn Anwendungen gleichzeitig in einer Umgebung mit Mehrfenstermodus ausgeführt werden, die unter Android 7.0 (API-Ebene 24) und höher unterstützt wird, verwaltet das System Aufgaben für jedes Fenster separat. Jedes Fenster kann mehrere Aufgaben haben. Dasselbe gilt für Android-Apps, die auf Chromebooks ausgeführt werden: Das System verwaltet Aufgaben oder Aufgabengruppen pro Fenster.

Lebenszyklus – Zusammenfassung

So fassen Sie das Standardverhalten für Aktivitäten und Aufgaben zusammen:

  • Wenn Aktivität A Aktivität B startet, wird Aktivität A gestoppt, aber das System behält ihren Status bei, z. B. die Scrollposition und jeglicher in Formulare eingegebener Text. Wenn der Nutzer in Aktivität B die Touch-Geste „Zurück“ tippt oder verwendet, wird Aktivität A mit wiederhergestelltem Status fortgesetzt.

  • Wenn der Nutzer eine Aufgabe über die Startbildschirmtaste oder die Touch-Geste verlässt, wird die aktuelle Aktivität angehalten und die Aufgabe in den Hintergrund verschoben. Das System behält den Status jeder Aktivität in der Aufgabe bei. Wenn der Nutzer die Aufgabe später fortsetzt, indem er das Launcher-Symbol auswählt, mit dem die Aufgabe begonnen hat, wird die Aufgabe in den Vordergrund gestellt und die Aktivität oben im Stack fortgesetzt.

  • Wenn der Nutzer darauf tippt oder auf „Zurück“ tippt, wird die aktuelle Aktivität aus dem Stapel entfernt und gelöscht. Die vorherige Aktivität im Stapel wird fortgesetzt. Wenn eine Aktivität gelöscht wird, behält das System den Status der Aktivität nicht bei.

    Dieses Verhalten unterscheidet sich bei Root Launcher-Aktivitäten, wenn deine App auf einem Gerät mit Android 12 oder höher ausgeführt wird.

  • Aktivitäten können mehrfach, auch aus anderen Aufgaben, instanziiert werden.

Aufgaben verwalten

Android verwaltet Aufgaben und den Back Stack, indem es alle nacheinander gestarteten Aktivitäten in der gleichen Aufgabe in einem Last-In-First-Out-Stack platziert. Das funktioniert bei den meisten Anwendungen hervorragend und Sie müssen sich normalerweise keine Gedanken darüber machen, wie Ihre Aktivitäten mit Aufgaben verknüpft sind oder wie sie im Backstack vorhanden sind.

Möglicherweise möchten Sie jedoch die normale Funktionsweise unterbrechen. Beispielsweise kann es sinnvoll sein, dass eine Aktivität in Ihrer Anwendung eine neue Aufgabe startet, wenn sie gestartet wird, anstatt sie in die aktuelle Aufgabe zu verschieben. Wenn Sie eine Aktivität starten, können Sie auch eine vorhandene Instanz der Aktivität weiterleiten, anstatt eine neue Instanz auf dem Back-Stack zu erstellen. Oder Sie möchten, dass Ihr Back-Stack von allen Aktivitäten außer der Stammaktivität gelöscht wird, wenn der Nutzer die Aufgabe verlässt.

Diese und weitere Möglichkeiten sind mit Attributen im Manifestelement <activity> und Flags im Intent möglich, den Sie an startActivity() übergeben.

Dies sind die Hauptattribute des Typs <activity>, mit denen Sie Aufgaben verwalten können:

Folgende Haupt-Intent-Flags können Sie verwenden:

In den folgenden Abschnitten wird erläutert, wie Sie mit diesen Manifestattributen und Intent-Flags festlegen, wie Aktivitäten mit Aufgaben verknüpft sind und wie sie sich im Back-Stack verhalten.

Außerdem werden die Überlegungen zur Darstellung und Verwaltung von Aufgaben und Aktivitäten im Bildschirm "Recents" (Zuletzt verwendet) erläutert. Normalerweise lässt das System definieren, wie Ihre Aufgabe und Aktivitäten auf dem Bildschirm „Recents“ (Letzte) dargestellt werden, und Sie müssen dieses Verhalten nicht ändern. Weitere Informationen finden Sie unter Bildschirm „Zuletzt verwendet“.

Startmodi definieren

Mit Startmodi können Sie festlegen, wie eine neue Instanz einer Aktivität der aktuellen Aufgabe zugeordnet wird. Sie können Startmodi auf zwei Arten definieren, wie in den folgenden Abschnitten beschrieben:

  • Manifestdatei verwenden

    Wenn Sie eine Aktivität in der Manifestdatei deklarieren, können Sie angeben, wie die Aktivität beim Start mit Aufgaben verknüpft ist.

  • Intent-Flags verwenden

    Wenn Sie startActivity() aufrufen, können Sie ein Flag in Intent einfügen, das deklariert, wie (oder ob) die neue Aktivität mit der aktuellen Aufgabe verknüpft ist.

Wenn also Aktivität A Aktivität B startet, kann Aktivität B in ihrem Manifest definieren, wie sie mit der aktuellen Aufgabe verknüpft ist, und Aktivität A kann ein Intent-Flag verwenden, um anzufordern, wie Aktivität B mit der aktuellen Aufgabe verknüpft werden kann.

Wenn beide Aktivitäten definieren, wie Aktivität B mit einer Aufgabe verknüpft wird, wird die Anfrage von Aktivität A gemäß Definition im Intent vor der Anfrage von Aktivität B gemäß der Definition im Manifest berücksichtigt.

Startmodi mithilfe der Manifestdatei definieren

Wenn Sie eine Aktivität in Ihrer Manifestdatei deklarieren, können Sie mithilfe des Attributs launchMode des Elements <activity> angeben, wie die Aktivität einer Aufgabe zugeordnet wird.

Es gibt fünf Startmodi, die Sie dem Attribut launchMode zuweisen können:

  1. "standard"
    Der Standardmodus. Das System erstellt eine neue Instanz der Aktivität in der Aufgabe, von der sie gestartet wurde, und leitet den Intent an diese weiter. Die Aktivität kann mehrmals instanziiert werden, jede Instanz kann zu verschiedenen Aufgaben gehören und eine Aufgabe kann mehrere Instanzen haben.
  2. "singleTop"
    Wenn oben in der aktuellen Aufgabe bereits eine Instanz der Aktivität vorhanden ist, leitet das System den Intent über einen Aufruf der Methode onNewIntent() an diese Instanz weiter, anstatt eine neue Instanz der Aktivität zu erstellen. Die Aktivität wird mehrmals instanziiert. Jede Instanz kann zu verschiedenen Aufgaben gehören und eine Aufgabe kann mehrere Instanzen haben. Dies gilt jedoch nur, wenn die Aktivität am Anfang des Back-Stacks keine vorhandene Instanz der Aktivität ist.

    Angenommen, der Back-Stack einer Aufgabe besteht aus Stammaktivität A mit den Aktivitäten B, C und D oben (der Stack ist also A-B-C-D, D liegt oben). Ein Intent wird für eine Aktivität vom Typ D empfangen. Wenn D den standardmäßigen "standard"-Startmodus hat, wird eine neue Instanz der Klasse gestartet und der Stack wird zu A-B-C-D-D. Wenn der Startmodus von D jedoch "singleTop" ist, erhält die vorhandene Instanz von D den Intent über onNewIntent(), da sie sich oben im Stack befindet und der Stack A-B-C-D bleibt. Wenn hingegen ein Intent für eine Aktivität vom Typ B eingeht, wird dem Stack eine neue Instanz von B hinzugefügt, auch wenn der Startmodus "singleTop" ist.

  3. "singleTask"
    Das System erstellt die Aktivität im Stamm einer neuen Aufgabe oder sucht die Aktivität zu einer vorhandenen Aufgabe mit derselben Affinität. Wenn bereits eine Instanz der Aktivität vorhanden ist, leitet das System den Intent über einen Aufruf der Methode onNewIntent() an die vorhandene Instanz weiter, anstatt eine neue Instanz zu erstellen. Währenddessen werden alle anderen Aktivitäten, die darüber hinausgehen, zerstört.
  4. "singleInstance".
    Das Verhalten ist dasselbe wie für "singleTask", mit der Ausnahme, dass das System keine anderen Aktivitäten in der Aufgabe startet, die die Instanz enthält. Die Aktivität ist immer das einzige Mitglied ihrer Aufgabe. Alle damit gestarteten Aktivitäten werden in einer separaten Aufgabe geöffnet.
  5. "singleInstancePerTask".
    Die Aktivität kann nur als Stammaktivität der Aufgabe ausgeführt werden, also als erste Aktivität, mit der die Aufgabe erstellt wurde. Daher kann es nur eine Instanz dieser Aktivität in einer Aufgabe geben. Im Gegensatz zum Startmodus singleTask kann diese Aktivität in mehreren Instanzen in verschiedenen Aufgaben gestartet werden, wenn das Flag FLAG_ACTIVITY_MULTIPLE_TASK oder FLAG_ACTIVITY_NEW_DOCUMENT gesetzt ist.

Als weiteres Beispiel deklariert die Android-Browser-App, dass die Webbrowseraktivität immer in einer eigenen Aufgabe geöffnet wird. Dazu wird der Startmodus singleTask im Element <activity> angegeben. Wenn Ihre App also einen Intent zum Öffnen des Android-Browsers ausgibt, wird ihre Aktivität nicht in derselben Aufgabe wie Ihre App platziert. Stattdessen wird entweder eine neue Aufgabe für den Browser gestartet oder, wenn im Browser bereits eine Aufgabe im Hintergrund ausgeführt wird, wird diese Aufgabe zur Verarbeitung des neuen Intents weitergeleitet.

Unabhängig davon, ob eine Aktivität in einer neuen Aufgabe oder in derselben Aufgabe wie die Aktivität beginnt, die sie gestartet hat, leiten die Schaltfläche „Zurück“ und die Touch-Geste den Nutzer immer zur vorherigen Aktivität weiter. Wenn Sie jedoch eine Aktivität starten, die den Startmodus singleTask angibt, und eine Instanz dieser Aktivität in einer Hintergrundaufgabe vorhanden ist, wird die gesamte Aufgabe in den Vordergrund gebracht. An dieser Stelle enthält der Back Stack alle Aktivitäten aus der Aufgabe, die an der Spitze des Stacks vorangetrieben werden. Abbildung 4 zeigt diese Art von Szenario.

Abbildung 4: Darstellung, wie eine Aktivität mit dem Startmodus "singleTask" dem Back-Stack hinzugefügt wird Wenn die Aktivität bereits Teil einer Hintergrundaufgabe mit einem eigenen Back-Stack ist, kommt auch der gesamte Back-Stack nach vorn, zusätzlich zur aktuellen Aufgabe.

Weitere Informationen zur Verwendung von Startmodi in der Manifestdatei finden Sie in der Dokumentation zum Element <activity>.

Startmodi mithilfe von Intent-Flags definieren

Wenn Sie eine Aktivität starten, können Sie die Standardverknüpfung einer Aktivität mit ihrer Aufgabe ändern. Dazu fügen Sie Flags in den Intent ein, den Sie an startActivity() senden. Mit den folgenden Flags können Sie das Standardverhalten ändern:

FLAG_ACTIVITY_NEW_TASK

Das System startet die Aktivität in einer neuen Aufgabe. Wenn bereits eine Aufgabe für die gestartete Aktivität ausgeführt wird, wird diese Aufgabe in den Vordergrund gebracht. Der letzte Status wird wiederhergestellt und die Aktivität empfängt den neuen Intent in onNewIntent().

Dies führt zum gleichen Verhalten wie der Wert "singleTask" launchMode, der im vorherigen Abschnitt erläutert wurde.

FLAG_ACTIVITY_SINGLE_TOP

Wenn die gestartete Aktivität die aktuelle Aktivität ist, die sich oben im Backstack befindet, erhält die vorhandene Instanz einen Aufruf an onNewIntent(), anstatt eine neue Instanz der Aktivität zu erstellen.

Dies führt zum gleichen Verhalten wie der Wert "singleTop" launchMode, der im vorherigen Abschnitt erläutert wurde.

FLAG_ACTIVITY_CLEAR_TOP

Wenn die gestartete Aktivität bereits in der aktuellen Aufgabe ausgeführt wird, löscht das System alle anderen Aktivitäten darüber, anstatt eine neue Instanz dieser Aktivität zu starten. Der Intent wird nun über onNewIntent() an die fortgesetzte Instanz der Aktivität übergeben.

Für das Attribut launchMode gibt es keinen Wert, der dieses Verhalten verursacht.

FLAG_ACTIVITY_CLEAR_TOP wird meistens in Verbindung mit FLAG_ACTIVITY_NEW_TASK verwendet. In Kombination finden diese Flags eine vorhandene Aktivität in einer anderen Aufgabe und verschieben sie an eine Position, an der sie auf den Intent reagieren kann.

Mit gemeinsamen Interessen umgehen

Eine Affinität gibt an, zu welcher Aufgabe eine Aktivität gehört. Standardmäßig haben alle Aktivitäten aus derselben Anwendung eine Affinität zueinander: Sie „bevorzugen“ es, in derselben Aufgabe zu arbeiten.

Sie können jedoch die Standardaffinität für eine Aktivität ändern. Aktivitäten, die in verschiedenen Apps definiert sind, können eine gemeinsame Affinität teilen, und Aktivitäten, die in derselben App definiert sind, können unterschiedliche Aufgabenaffinitäten zugewiesen werden.

Sie können die Affinität einer Aktivität mithilfe des Attributs taskAffinity des Elements <activity> ändern.

Das Attribut taskAffinity verwendet einen Stringwert, der sich von dem im Element <manifest> deklarierten Standardpaketnamen unterscheiden muss, da das System diesen Namen verwendet, um die Standardaufgabenaffinität für die Anwendung zu identifizieren.

Die Affinität kommt in zwei Situationen ins Spiel:

  1. Wenn der Intent, der eine Aktivität startet, das Flag FLAG_ACTIVITY_NEW_TASK enthält.

    Standardmäßig wird eine neue Aktivität mit dem Namen startActivity() in die Aufgabe der Aktivität gestartet. Sie wird auf denselben Back Stack wie der Aufrufer verschoben.

    Wenn der an startActivity() übergebene Intent jedoch das Flag FLAG_ACTIVITY_NEW_TASK enthält, sucht das System nach einer anderen Aufgabe, um die neue Aktivität zu speichern. Oftmals ist das eine neue Aufgabe. Das muss aber nicht so sein. Wenn es eine vorhandene Aufgabe mit derselben Affinität wie die neue Aktivität gibt, wird die Aktivität für diese Aufgabe gestartet. Wenn nicht, beginnt eine neue Aufgabe.

    Wenn dieses Flag dazu führt, dass eine Aktivität eine neue Aufgabe startet und der Nutzer die Startbildschirmtaste oder Touch-Geste verwendet, um sie zu verlassen, muss es eine Möglichkeit geben, wie er zur Aufgabe zurückkehren kann. Einige Entitäten, z. B. der Benachrichtigungsmanager, starten Aktivitäten immer in einer externen Aufgabe, nie als Teil ihrer eigenen. Daher setzen sie immer FLAG_ACTIVITY_NEW_TASK in die Intents, die sie an startActivity() übergeben.

    Wenn eine externe Entität, die dieses Flag verwenden könnte, Ihre Aktivität aufrufen kann, muss der Nutzer eine unabhängige Möglichkeit haben, zur gestarteten Aufgabe zurückzukehren, z. B. durch ein Launcher-Symbol. Hier hat die Stammaktivität der Aufgabe einen CATEGORY_LAUNCHER-Intent-Filter. Weitere Informationen finden Sie im Abschnitt zum Starten von Aufgaben.

  2. Wenn das Attribut allowTaskReparenting einer Aktivität auf "true" gesetzt ist.

    In diesem Fall kann die Aktivität von der Aufgabe, bei der sie gestartet wird, zu der Aufgabe verschoben werden, für die sie eine Affinität hat, wenn diese Aufgabe in den Vordergrund kommt.

    Angenommen, eine Aktivität, mit der die Wetterbedingungen in ausgewählten Städten gemeldet werden, ist als Teil einer Reise-App definiert. Sie hat dieselbe Affinität wie andere Aktivitäten in derselben App, die standardmäßige App-Affinität und kann mit diesem Attribut wieder eingeordnet werden.

    Wenn eine Ihrer Aktivitäten die Wetterberichtsaktivität startet, gehört sie zunächst zu derselben Aufgabe wie Ihre Aktivität. Wenn die Aufgabe der Reise-App jedoch in den Vordergrund rückt, wird die Aktivität der Wettermelder dieser Aufgabe neu zugewiesen und darin angezeigt.

Back Stack leeren

Wenn der Nutzer eine Aufgabe für längere Zeit verlässt, löscht das System alle Aktivitäten mit Ausnahme der Stammaktivität. Wenn der Nutzer zur Aufgabe zurückkehrt, wird nur die Stammaktivität wiederhergestellt. Das System verhält sich auf diese Weise und geht von der Annahme aus, dass Nutzer nach längerer Zeit ihre Arbeit aufgegeben haben und zur Aufgabe zurückkehren, um etwas Neues zu beginnen.

Es gibt einige Aktivitätsattribute, mit denen Sie dieses Verhalten ändern können:

alwaysRetainTaskState
Wenn dieses Attribut in der Stammaktivität einer Aufgabe auf "true" gesetzt ist, tritt das gerade beschriebene Standardverhalten nicht ein. Die Aufgabe behält alle Aktivitäten in ihrem Stack bei, auch nach einem langen Zeitraum.
clearTaskOnLaunch

Wenn dieses Attribut in der Stammaktivität einer Aufgabe auf "true" gesetzt ist, wird die Aufgabe in die Stammaktivität verschoben, wenn der Nutzer die Aufgabe verlässt und zu ihr zurückkehrt. Mit anderen Worten, das ist das Gegenteil von alwaysRetainTaskState. Der Nutzer kehrt immer in seinem ursprünglichen Zustand zur Aufgabe zurück, auch wenn er die Aufgabe nur für einen Moment verlassen hat.

finishOnTaskLaunch

Dieses Attribut ist wie clearTaskOnLaunch, wird jedoch für eine einzelne Aktivität ausgeführt, nicht für eine ganze Aufgabe. Dies kann auch dazu führen, dass jede Aktivität mit Ausnahme der Root-Aktivität beendet wird. Wenn "true" festgelegt ist, bleibt die Aktivität nur für die aktuelle Sitzung Teil der Aufgabe. Wenn der Nutzer die Aufgabe verlässt und dann zur Aufgabe zurückkehrt, ist sie nicht mehr vorhanden.

Aufgaben starten

Sie können eine Aktivität als Einstiegspunkt für eine Aufgabe einrichten, indem Sie ihr einen Intent-Filter mit "android.intent.action.MAIN" als angegebene Aktion und "android.intent.category.LAUNCHER" als Kategorie zuweisen:

<activity ... >
    <intent-filter ... >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    ...
</activity>

Ein Intent-Filter dieser Art führt dazu, dass ein Symbol und ein Label für die Aktivität im App Launcher angezeigt werden. So haben Nutzer die Möglichkeit, die Aktivität zu starten und nach dem Start jederzeit zu der von ihr erstellten Aufgabe zurückzukehren.

Diese zweite Fähigkeit ist wichtig. Nutzer müssen eine Aufgabe verlassen und über diesen Aktivitäts-Launcher später zu ihr zurückkehren können. Verwenden Sie daher die beiden Startmodi "singleTask" und "singleInstance", mit denen Aktivitäten immer eine Aufgabe initiieren, nur dann, wenn die Aktivität einen ACTION_MAIN- und einen CATEGORY_LAUNCHER-Filter hat.

Stellen Sie sich beispielsweise vor, was passieren könnte, wenn der Filter fehlt: Ein Intent startet eine "singleTask"-Aktivität, initiiert eine neue Aufgabe und der Nutzer verbringt einige Zeit damit, an dieser Aufgabe zu arbeiten. Der Nutzer verwendet dann die Home-Taste oder Touch-Geste. Die Aufgabe wird jetzt in den Hintergrund verschoben und ist nicht mehr sichtbar. Der Nutzer kann nicht mehr zur Aufgabe zurückkehren, da sie nicht im App Launcher zu sehen ist.

Wenn Sie nicht möchten, dass der Nutzer zu einer Aktivität zurückkehren kann, setzen Sie den finishOnTaskLaunch des <activity>-Elements auf "true". Weitere Informationen finden Sie im Abschnitt zum Löschen des Back Stacks.

Weitere Informationen dazu, wie Aufgaben und Aktivitäten auf dem Bildschirm „Letzte“ angezeigt und verwaltet werden, finden Sie unter Letzte.

Weitere Informationen