Das animierte CheatSheet für den Android-Startmodus

20. Dezember, 2018 – 6 min read

Vor API 11 haben wir Aktivitäten jede neue Seite auf dem Bildschirm angezeigt. Jetzt, mit Fragmenten und den Navigationswerkzeugen in API 28, ist es durchaus möglich, eine sehr komplexe Anwendung mit nur einer Aktivität zu erstellen. Aktivitäten eignen sich jedoch immer noch hervorragend, um Ihre App in Phasen und Prozesse zu unterteilen. Vielleicht möchten Sie das gesamte Marketing in eine Aktivität aufteilen und die eigentliche App in einer eigenen Aktivität haben. Vielleicht möchten Sie einen Bereich für eine Funktion reservieren, z. B. einen Chat-Dienst. Wenn Sie die Startmodi der Aktivitäten kennen, können Sie diese Prozesse besser so aufteilen, dass sie für Ihre Benutzer sinnvoll sind. Da ich bei der Arbeit sitze und mir die Startmodi nicht aus dem Kopf gehen, dachte ich mir, ich schreibe einen Blog darüber, animiere ein paar Gifs, um die Konzepte zu veranschaulichen, und teile ihn dann mit allen. Viel Spaß damit!

Bevor wir über die Startmodi sprechen, sollten wir zunächst die Rolle einer Aufgabe verstehen. Eine Aufgabe enthält eine Sammlung von Aktivitäten, die in einem Stapel, dem Backstack, angeordnet sind. Die erste Aktivität, die in einer Aufgabe gestartet wird, ist die Stammaktivität. Das Drücken des Zurück-Buttons bei einer Stammaktivität beendet nicht nur die Aktivität, sondern auch die Aufgabe und möglicherweise die Anwendung.

Lassen Sie uns nun in einige Startmodi eintauchen!

Angenommen, Sie haben eine Aufgabe mit einer Stammaktivität namens Aktivität A und starten dann eine neue Aktivität namens B. B wird an die Spitze des Stapels geschoben. Wenn Sie nun eine weitere Aktivität B aus der soeben erstellten Aktivität B starten, haben Sie nun zwei Instanzen der Aktivität B übereinander gestapelt. Wenn ein Benutzer die Zurück-Taste drückt, kehrt er zu einer anderen Instanz von Aktivität B zurück. Dies könnte für den Benutzer sehr verwirrend sein. Das Stapeln und Erstellen von Aktivitäten übereinander, egal wie, wird als Standardstartmodus bezeichnet. Wenn im XML-Manifest der Aktivität kein Startmodus definiert ist, verwendet die Aktivität den Standardstartmodus.

Nachdem wir nun gesehen haben, wie der Standardmodus für den Benutzer verwirrend sein kann, können wir nun den Single Top Startmodus verstehen. Dieser Startmodus verhindert, dass verschiedene Instanzen der gleichen Aktivitäten übereinander gestapelt werden. Nehmen wir an, Aktivität B ist ein Single Top. Wir können die Startmodi im Manifest wie folgt definieren:

///AndroidManifest.xml
<application
...>
<activity android:name=".Activity_A">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> <activity android:name=".Activity_B" android:launchMode="singleTop"/> <activity android:name=".Activity_C"/>
<activity android:name=".Activity_D"/>
</application>

Wenn Sie nun Aktivität B von Aktivität B aus starten, wird die Absicht in die aktuelle Instanz von B übertragen, anstatt eine neue Instanz von B zu erstellen und sie auf die alte B zu stapeln. Die einzige Möglichkeit, zwei Instanzen der gleichen Aktivität in einer Aufgabe zu haben, besteht darin, eine andere Aktivität von B aus zu starten und dann B von dieser Aktivität aus zu erstellen. Das Hauptkonzept des Single-Top-Startmodus besteht darin, dass Sie nicht zwei Instanzen derselben Aktivität übereinander stapeln können.

Wenn Sie keine zwei Instanzen derselben Single-Top-Aktivität in einer Aufgabe haben wollen, während Sie den Single-Top-Startmodus verwenden, können Sie die Konstante FLAG_ACTIVITY_CLEAR_TOP in Ihrer Absicht übergeben. Um zu veranschaulichen, was dies bewirkt, nehmen wir an, Ihr Aktivitätsstapel ist ABC (B ist immer noch Single Top). Wenn Sie B von C aus mit FLAG_ACTIVITY_CLEAR_TOP starten, wird Ihr Stack bis zu B heruntergeklappt und der Intent wird an genau diese Instanz von B übergeben.

// code example for passing the constant flag in your intentIntent intent = new Intent(this, Activity_B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

Der nächste Startmodus wird Single Task genannt. In diesem Startmodus legen wir fest, dass eine Aktivität nur zu einer Aufgabe in der gesamten App gehören kann. Ähnlich wie beim FLAG_ACTIVITY_CLEAR_TOP-Verhalten, wenn Ihr Stack ABC ist und Sie B (eine einzelne Aufgabe) von C aus starten, poppen wir den ganzen Weg nach unten zu B und übergeben die Absicht an diese Instanz.

<activity android:name=".Activity_B" android:launchMode="singleTask"/>

Aber was, wenn wir wollen, dass B in einer eigenen Aufgabe ist? An dieser Stelle kommt die Task-Affinität ins Spiel. Mit der Aufgabenaffinität können Sie festlegen, zu welcher Aufgabe eine Aktivität gehört. Standardmäßig hat eine Aktivität die gleiche Aufgabenaffinität wie ihre Stammaktivität. Mit der Aufgabenaffinität können wir nun Aktivitäten in verschiedene Aufgaben aufteilen.

<activity android:name=".Activity_A"
android:taskAffinity="com.affinity.of.a">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity><activity android:name=".Activity_B"
android:launchMode="singleTask"
android:taskAffinity="com.affinity.of.b"
/>

Hier haben Aktivität A und Aktivität B unterschiedliche Aufgabenaffinitäten. Wenn A in Task 1 erstellt wird, wird C von A aus gestartet. Standardmäßig hat jede Aktivität die gleiche Affinität wie ihre Wurzel, also sind wir immer noch in Task 1. Jetzt wird B von C aus gestartet. B hat eine andere Task-Affinität, so dass es jetzt die Wurzel von Task 2 ist, die dann in den Vordergrund rückt. Wenn wir eine neue Instanz der Aktivität C von B aus starten, gehört C zu Task 2, da dies die Task-Affinität der Stammaktivität (in diesem Fall B) ist. Was aber, wenn wir nun versuchen, A von C aus in Task 2 zu starten? Da die Affinität von A zu Task 1 ist, wechseln wir von Task 2 zu Task 1, springen den ganzen Weg zurück zu Aktivität A und übergeben schließlich die Absicht an A.

Das Wissen über Single Task wird uns helfen, den letzten Startmodus besser zu verstehen: Single Instance. Wie Single Task kann eine Aktivität mit Single Instance die einzige Aktivität in allen Tasks sein. Der Unterschied zwischen den beiden ist, dass eine Aktivität mit Einzelinstanz auch die einzige Aktivität in einer Aufgabe sein kann.

<activity android:name=".Activity_B"
android:launchMode="singleInstance"
android:taskAffinity="com.affinity.of.b"
/>

In diesem Beispiel hat Aktivität B einen Startmodus von Einzelinstanz. Aktivität A in Aufgabe 1 startet Aktivität B. Dadurch wird Aktivität B in einer neuen Aufgabe gestartet, die dann in den Vordergrund gestellt wird. Aktivität B startet dann Aktivität C. Da eine einzelne Instanz die einzige Aktivität in einer Aufgabe sein kann, wird C über Aktivität A in Aufgabe 1 gestartet, und dann kommt Aufgabe 1 in den Vordergrund.

Aufgabenaffinität spielt auch eine Rolle bei Einzelinstanz. Wenn Aktivität B keine Task-Affinität hat, kann ein Benutzer nicht zurück zu Task 1 navigieren. Wenn B eine Aufgabenaffinität hat, kann ein Benutzer zwischen Aufgabe 1 und 2 hin- und herwechseln.

Das Wissen über Startmodi hilft mir, bessere UI/UX-Erfahrungen für meine Benutzer zu machen, und hilft mir sogar, einige unangenehme Bugs zu lösen, also hoffe ich, dass diese Informationen auch Ihnen helfen!

Ich möchte Anil Deshpande’s CodeTutor youtube Seite loben, die mir geholfen hat, das Konzept besser zu verstehen. Hier ist das erste von sieben Videos zu diesem Thema: https://www.youtube.com/watch?v=m8sf0UkJkxo

Schreibe einen Kommentar