Den Startmodus der Activity in Android verstehen
Sharing is caring!
Der Startmodus der Activity spielt eine wichtige Rolle, um die Task und den Backstack zu erhalten. Bevor wir den Startmodus erklären, müssen wir zuerst verstehen, was ein Task und ein Backstack ist?
Task
Ein Task ist ein „Stapel von Aktivitäten“ in Ihrer Anwendung. Wenn eine Aktivität in den Hintergrund geschickt wird (z. B. durch Drücken der HOME-Taste, während sie angezeigt wird), wird der gesamte Task (und alle darin enthaltenen Aktivitäten) ebenfalls zurückgeschickt. Wenn der Benutzer dann auf Ihre Anwendung klickt, wird die Aufgabe (und die Reihenfolge ihrer Aktivitäten) wieder angezeigt. Mit anderen Worten: Eine Aufgabe ist eine Sammlung von Aktivitäten, mit denen Benutzer interagieren, wenn sie eine bestimmte Aufgabe ausführen. Die Aktivitäten sind in einem Stapel – dem Backstack – angeordnet, und zwar in der Reihenfolge, in der die einzelnen Aktivitäten geöffnet werden.
Wenn also ein Benutzer eine Anwendung über das Home-Symbol startet, navigiert er durch verschiedene Bildschirme, so dass verschiedene Aktivitäten übereinander angeordnet werden. Diese Sammlung von Aktivitäten wird als Aufgaben bezeichnet.
Back Stack
Aktivitäten werden in der Reihenfolge angeordnet, in der jede Aktivität geöffnet wird. Dieser gepflegte Stapel wird Back Stack genannt. Wenn Sie eine neue Aktivität mit startActivity() starten, wird eine neue Aktivität auf Ihre Aufgabe „geschoben“ und die vorherige Aktivität in den Back Stack gelegt.
Sobald Sie den Back Button drücken, wird die oberste Aktivität „gepoppt“ und aus dem Back Stack entfernt und Sie kehren zur vorherigen Aktivität zurück.
Launch Mode
Ein „Launch Mode“ ist die Art und Weise, wie eine neue Instanz einer Aktivität mit der aktuellen Aufgabe verknüpft werden soll. Startmodi können mit einem von zwei Mechanismen definiert werden:
- Durch Deklaration in der Datei AndroidManifest.xml
- Durch Hinzufügen des Flags mit Intent.
Es gibt vier Arten von Startmodi für Aktivitäten. Diese sind:
- Standard
- SingleTop
- SingleTask
- SingleInstance
Manifestdatei: Wenn Sie eine Aktivität in einer Manifestdatei deklarieren, können Sie angeben, wie die Aktivität mit Aufgaben verknüpft werden soll, wenn sie startet.
Exp:
<activity android:launchMode = ../>
Intent Flag: Android bietet auch Activity-Flags, mit denen Sie das Standardverhalten der Activity-Assoziation mit Tasks beim Start über die startActivity()-Methode ändern können.
FLAG_ACTIVITY_NEW_TASK -> similar to "launchMode = singleTask"FLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_SINGLE_TOP -> similar to "launchMode = singleTop"FLAG_ACTIVITY_CLEAR_TOP
standard
(Standard) : Dies ist der übliche Modus für die meisten Aktivitäten.
Mehrere Instanzen der Aktivitätsklasse können instanziiert werden und mehrere Instanzen können der gleichen Aufgabe oder verschiedenen Aufgaben hinzugefügt werden.
Beispiel:
Angenommen, Sie haben die Aktivitäten A, B, C und D und Ihre Aktivität B hat „Startmodus = Standard“. Nun starten Sie erneut die Aktivität B –
Zustand des Aktivitätsstapels vor dem Start B
A -> B -> C -> D
Zustand des Aktivitätsstapels nach dem Start B
A -> B -> C -> D -> B
singleTop
: Der Unterschied zum Standard besteht darin, dass, wenn bereits eine Instanz der Aktivität an der Spitze der aktuellen Aufgabe existiert und das System den Intent an diese Aktivität weiterleitet, keine neue Instanz erzeugt wird, da eine MethodeonNewIntent()
ausgelöst wird, anstatt ein neues Objekt zu erzeugen.
Beispiel:
Fall 1:
Angenommen, Sie haben die Aktivitäten A, B und C und Ihre Aktivität D hat „launch mode = singleTop“. Jetzt startest du Aktivität D –
Zustand des Aktivitätsstapels vor dem Start D
A -> B -> C
Zustand des Aktivitätsstapels nach dem Start D Aktivität
A -> B -> C -> D (Hier startet D wie üblich)
Fall 2:
Angenommen, du hast A, B, C und D Aktivitäten und deine Aktivität D hat „Startmodus = singleTop“. Nun starten Sie erneut die Aktivität D –
Zustand des Aktivitätsstapels vor dem Start D
A -> B -> C -> D
Zustand des Aktivitätsstapels nach dem Start D Aktivität
A -> B -> C -> D (Hier wird die alte Instanz aufgerufen und die Absichtsdaten werden durch onNewIntent()
Callback geleitet)
singleTask
: Es wird immer eine neue Aufgabe erstellt und eine neue Instanz wird der Aufgabe als Wurzel hinzugefügt. Wenn jedoch eine Aktivitätsinstanz in einer beliebigen Aufgabe vorhanden ist, leitet das System die Absicht über den Aufruf der Methode onNewIntent()
an diese Aktivitätsinstanz weiter. In diesem Modus können Aktivitätsinstanzen in dieselbe Aufgabe verschoben werden. Dieser Modus ist nützlich für Aktivitäten, die als Einstiegspunkte fungieren.
Beispiel:
Fall 1:
Angenommen, Sie haben die Aktivitäten A, B und C und Ihre Aktivität D hat „launch mode = singleTask“. Nun starten Sie die Aktivität D –
Zustand des Aktivitätsstapels vor dem Start D
A -> B -> C
Zustand des Aktivitätsstapels nach dem Start der Aktivität D
A -> B -> C -> D (Hier startet D wie gewohnt)
Fall 2:
Angenommen, Sie haben die Aktivitäten A, B, C und D und Ihre Aktivität B hat den „Startmodus = singleTask“. Nun starten Sie erneut die Aktivität B-
Zustand des Aktivitätsstapels vor dem Start D
A -> B -> C -> D
Zustand des Aktivitätsstapels nach dem Start der Aktivität B
A -> B (Hier wird die alte Instanz aufgerufen und die Intent-Daten werden durch den onNewIntent()-Callback weitergeleitet)
Auch beachten Sie, dass die Aktivitäten C und D hier zerstört werden.
singleInstance
: Wie singleTask
, außer dass keine Instanz der Aktivität in dieselbe Aufgabe der singleInstance
geschoben werden kann. Dementsprechend ist die Aktivität mit Startmodus immer in einer einzigen Aktivitätsinstanz Aufgabe. Dies ist ein sehr spezieller Modus und sollte nur in Anwendungen verwendet werden, die vollständig als eine Aktivität implementiert sind.
Beispiel:
Fall 1:
Angenommen, Sie haben die Aktivitäten A, B und C und Ihre Aktivität D hat „launch mode = singleInstance“. Nun starten Sie die Aktivität D –
Zustand des Aktivitätsstapels vor dem Start D
A -> B -> C
Zustand des Aktivitätsstapels nach dem Start D Aktivität
Task1-A -> B -.> C
Aufgabe2-D (hier wird D in einer anderen Aufgabe sein)
Wenn Sie dies nun fortsetzen und E und D starten, dann sieht der Stapel wie folgt aus-
Aufgabe1-A -> B -> C -> E
Aufgabe2-D
Fall 2:
Angenommen, Sie haben die Aktivitäten A, B, C in einer Aufgabe und die Aktivität D ist in einer anderen Aufgabe mit „launch mode = singleInstance“. Nun starten Sie erneut Aktivität D-
Zustand des Aktivitätsstapels vor dem Start D
Task1-A -> B -> C
Task2-D
Zustand des Aktivitätsstapels nach dem Start B-Aktivität
Task1-A -> B -> C
Task2-D (Hier wird die alte Instanz aufgerufen und die Intent-Daten werden durch den onNewIntent()-Callback geleitet)
FLAG_ACTIVITY_NEW_TASK
: Gleich wie der WertsingleTask
in der Manifestdatei (siehe oben).
FLAG_ACTIVITY_SINGLE_TOP
: Gleich wie der WertsingleTop
in der Manifestdatei (siehe oben).
FLAG_ACTIVITY_CLEAR_TOP
: Wenn die zu startende Aktivität bereits in der aktuellen Aufgabe läuft, dann werden, anstatt eine neue Instanz dieser Aktivität zu starten, alle anderen Aktivitäten darüber zerstört und dieser Intent wird an die wiederaufgenommene Instanz der Aktivität (jetzt an der Spitze) geliefert.onNewIntent()
Es gibt keinen entsprechenden Wert in der Manifestdatei, der dieses Verhalten hervorruft. Die Referenzen, die ich für diesen Artikel verwendet habe, sind hier und hier.
Bitte melden Sie sich per E-Mail an, um alle Newsletter dieses Blogs zu erhalten, und wenn Sie das Gefühl haben, dass dieser Beitrag Ihnen hilft, besser zu verstehen, dann vergessen Sie nicht, sich anzumelden, zu teilen und unten zu kommentieren. Ok, dann sehen wir uns in meinem nächsten Tutorial, bis dahin viel Spaß beim Programmieren 🙂
Ich bin ein sehr enthusiastischer Android Entwickler, um solide Android Apps zu entwickeln. Ich habe ein großes Interesse an der Entwicklung für Android und habe Apps im Google Play Store veröffentlicht. Ich bin immer offen dafür, neue Technologien zu lernen. Für Hilfe stehe ich jederzeit unter [email protected]
zur Verfügung.