Startmodi von Aktivitäten – standard
In echten Projekten legen wir für jede Aktivität den passenden Startmodi fest, abhängig von den Anforderungen.
Es gibt vier Startmodi:
standard, singleTop, singleTask und singleInstance
Sie können das Attribut launchMode einer Aktivität in der AndroidManifest.xml festlegen
standard ist der voreingestellte Startmodus
Ohne explizite Angabe nutzen alle Aktivitäten diesen Modus
In diesem Modus landet jede neue Aktivität oben auf dem Stack
Das System prüft nicht, ob diese Aktivität bereits im Stack vorhanden ist.
Bei jedem Start wird eine neue Instanz der Aktivität erzeugt
Hauptaktivität –> Normale Aktivität —> Hauptaktivität starten (neue Instanz)
Für diese neu erstellte Hauptaktivität ignoriert das System die ursprüngliche Instanz
Sehen wir uns eine Demonstration an
Fügen Sie der Hauptaktivität einen Button hinzu. Im Button-Click-Handler starten Sie die Hauptaktivität erneut mit Intent
Frage: Es scheint, als bräuchten wir nur einmal zurück zu drücken, um die App zu schließen
Weiß jemand woran das liegt?
Teilen Sie Ihre Erkenntnisse, falls Sie die Ursache finden.
Startmodi von Aktivitäten – singleTop
Wenn eine Aktivität auf singleTop gesetzt ist, prüft das System vor dem Start, ob sie sich bereits an der Spitze des Back-Stacks befindet. Falls ja, wird die vorhandene Instanz wiederverwendet und keine neue erstellt.
Probieren wir es aus. Legen Sie in AndroidManifest.xml das launchMode-Attribut der Hauptaktivität auf singleTop fest
Egal wie oft Sie den Button klicken, es entsteht keine neue Hauptaktivität. Der Log-Eintrag erscheint nur einmal.
Einmal zurück drücken schließt die Android-App
Wenn die Aktivität aber nicht an der Stack-Spitze steht, kann trotzdem eine neue Instanz erzeugt werden
Ändern wir den Intent, öffnen zuerst eine andere Aktivität,
und starten dann die Hauptaktivität aus dieser zweiten Aktivität.
Wenn wir auf der zweiten Aktivität sind, ist die Stack-Spitze nicht die Hauptaktivität. Daher wird eine neue Instanz erstellt.
I/Choreographer: Skipped 37 frames! The application may be doing too much work on its main thread.Code-Sprache: HTTP (http)
Problem: Zurück-Taste führt direkt zum Startbildschirm (aus den letzten zwei Lektionen)
Der Grund war eine zusätzliche Zeile finish(); im Button-Code
Log.e(TAG, this.toString()); gibt die Speicheradresse der aktuellen Aktivität aus
singleTask Modus
Mit singleTask existiert von einer Aktivität nur eine einzige Instanz in der gesamten Anwendung.
singleTop garantiert dagegen nur eine einzelne Instanz, solange die Aktivität auf Stack-Spitze liegt.
singleInstance Modus und Tasks
Bei diesem Modus erstellt das System einen separaten Back-Stack zur Verwaltung dieser Aktivität
Beispiel: Wir haben drei Aktivitäten. Legen Sie für die zweite Aktivität launchMode auf singleInstance fest, dann wird sie von einem eigenen Back-Stack verwaltet.
Wir navigieren von Aktivität 1 zu Aktivität 2, danach von Aktivität 2 zu Aktivität 3.
Drücken wir zurück in Aktivität 3, landen wir zuerst in Aktivität 1, weil beide zum selben Back-Stack gehören.
Drücken wir erneut zurück in Aktivität 1, wechseln wir zu Aktivität 2. Der Stack von Aktivität 1 ist leer, das System springt also zur obersten Aktivität des anderen Task-Stacks, nämlich Aktivität 2. Noch einmal zurück führt zum Startbildschirm.
public void onClick(View view){
Intent it = new Intent(NormalActivity.this,Activity3.class);
startActivity(it);
finish();
}Code-Sprache: JavaScript (javascript)
05-13 08:14:26.890 4746-4746/com.foxdevelop.www.lifedemo E/Hauptaktivität: 113
05-13 08:14:33.755 4746-4746/com.foxdevelop.www.lifedemo E/Normale Aktivität: 114
05-13 08:14:37.932 4746-4746/com.foxdevelop.www.lifedemo E/Dritte Aktivität: 113
Startmodi von Aktivitäten