Mono for Android – Activity Lifecycle


Download ActivityLifecycle.sln Testprojekt

1. Cold-Start

Dieser Fall tritt auf wenn:

Die App wird das erste Mal gestartet oder
Die App wird gestartet wenn sie mit dem Back-Button (Hardware) beendet wurde

07-30 13:09:20.313 I/mono-stdout(30929): A OnCreate
07-30 13:09:20.353 I/mono-stdout(30929): A OnStart
07-30 13:09:20.363 I/mono-stdout(30929): A OnResume

Bei der Funktion OnCreate(Bundle bundle) ist bundle gleich null weil kein gespeicherter State bekannt ist.

2. Den Back-Button drücken

07-30 13:10:38.183 I/mono-stdout(30929): A OnPause
07-30 13:10:38.403 I/mono-stdout(30929): A OnStop
07-30 13:10:38.463 I/mono-stdout(30929): A OnDestroy | IsFinishing: True

isFinishing: True heißt das das Activity-Property IsFinishing in der OnDestroy-Methode hat den Wert true. Das ist der Fall wenn der Anwender

den Back-Button drückt oder
die Funktion Finish() der Activity wird im Code aufgerufen
isFinishing ist false wenn die Activity nach einer Rotation des Handys geschlossen wird um sie dann wieder zu starten

3. Den Screen-Lock-Button drücken

Wenn die Hardwaretaste zum ausschalten des Bildschirms gedrückt wird passiert das folgende:

07-31 09:53:05.546 I/mono-stdout( 1061): A OnSaveInstanceState
07-31 09:53:05.556 I/mono-stdout( 1061): A OnPause

Beim Einschalten des Displays wird OnResume aufgerufen

07-31 09:53:18.506 I/mono-stdout( 1061): A OnResume

4. Eine andere Activity kommt in den Vordergrund

Es gibt zwei Varianten:

4.1 Eine Vollbild und nicht transparente Activity kommt in den Vordergrund

Dieser Fall tritt auf wenn:

Der Home-Button wird gedrückt (z.B.: der Homescreen wird gezeigt) oder
Der Home-Button wird lange gedrückt und der Anwender wechselt die Activity oder
Der User klickt auf „Start Activity B“ (Wechsel der Activity – Siehe Log unten) oder
Ein Anruf
07-30 13:41:25.893 I/mono-stdout(31178): A onSaveInstanceState
07-30 13:41:25.903 I/mono-stdout(31178): A OnPause
07-30 13:41:25.943 I/mono-stdout(31178): B OnCreate
07-30 13:41:25.953 I/mono-stdout(31178): B OnStart
07-30 13:41:25.953 I/mono-stdout(31178): B OnResume
07-30 13:41:26.203 I/mono-stdout(31178): A OnStop

Wichtig: Es wird nicht garantiert das onSaveInstanceState vor oder nach onPause aufgerufen wird.

Das nächste Mal wenn die Activity A aufgerufen wird werden folgende Funktionen aufgerufen:

07-30 13:56:19.103 I/mono-stdout(31386): A OnRestart
07-30 13:56:19.103 I/mono-stdout(31386): A OnStart
07-30 13:56:19.103 I/mono-stdout(31386): A OnResume

4.2 Eine Nicht-Vollbild und transparente Activity kommt in den Vordergrund

Eine Nicht-Vollbild und transparente Activity ist zum Beispiel eine Activity die mit dem Theme Attribut versehen ist ([Activity(Label = “D Activity”, Theme = “@android:style/Theme.Dialog”)]). Im Beispiel-Projekt kann man diese Activity mit dem Button „Start activity D“ starten.

07-30 14:32:44.183 I/mono-stdout(31862): A OnSaveInstanceState
07-30 14:32:44.183 I/mono-stdout(31862): A OnPause
07-30 14:32:44.253 I/mono-stdout(31862): D OnCreate
07-30 14:32:44.263 I/mono-stdout(31862): D OnStart
07-30 14:32:44.263 I/mono-stdout(31862): D OnResume

Wichtig: Die Funktion A OnStop wird nicht aufgerufen. Das heißt die Activity ist nicht gestoppt und sichtbar durch die transparente Activity D.

Wenn man in Activity D den Back-Button drückt passiert folgendes:

07-30 14:36:53.823 I/mono-stdout(31862): D OnPause
07-30 14:36:53.843 I/mono-stdout(31862): A OnResume
07-30 14:36:53.903 I/mono-stdout(31862): D OnStop
07-30 14:36:53.933 I/mono-stdout(31862): D OnDestroy | IsFinishing: True

Nun wird nur onResume() aufgerufen. Ein anderes Beispiel wenn nur onResume() aufgerufen wird ist wenn eine Activity nicht korrekt gestartet wird. Zum Beispiel wenn finish() aufgerufen wird bevor die Activity in den Vordergrund geht (z.b.: in der onCreate Funktion). Dies ist im Beispielprojekt der Fall wenn man auf “Start activity C” klickt.

5. Warm-Start

Dieser Fall tritt auf wenn:

die Activity „Cold“ gestartet wurde und eine andere Activity (Vollbild, nicht transparent) in den Vordergrund kommt und danach wieder zurück gewechselt wird
07-30 13:56:19.103 I/mono-stdout(31386): A OnRestart
07-30 13:56:19.103 I/mono-stdout(31386): A OnStart
07-30 13:56:19.103 I/mono-stdout(31386): A OnResume

Der Hauptunterschied zwischen “Cold“ und „Warm“ ist das beim „Warm“-Start die Funktion onRestart anstatt onCreate aufgerufen wird.

6. Orientierungswechsel

Standartmäßig wird die Activity beim Drehen gestoppt und wieder gestartet.

07-30 15:00:51.643 I/mono-stdout(31955): A OnSaveInstanceState
07-30 15:00:51.653 I/mono-stdout(31955): A OnPause
07-30 15:00:51.673 I/mono-stdout(31955): A OnStop
07-30 15:00:51.733 I/mono-stdout(31955): A OnDestroy | IsFinishing: False
07-30 15:00:51.793 I/mono-stdout(31955): A OnCreate
07-30 15:00:51.793 I/mono-stdout(31955): A OnStart
07-30 15:00:51.803 I/mono-stdout(31955): A OnRestoreInstanceState
07-30 15:00:51.803 I/mono-stdout(31955): A OnResume

Wichtig dabei:

onSaveInstanceState der Activity wird aufgerufen was die Möglichkeit ergibt den State der Activity zu speichern
isFinishing gibt False zurück
Wenn die Activity wieder gestartet wird, wird onRestoreInstanceState (Bundle) aufgerufen mit dem Bundle das in onSaveInstanceState gespeichert wurde
Die zwei Funktionen onSaveInstanceState und onRestoreInstanceState sind nicht gepaart. Wenn onSaveInstanceState aufgerufen wird dann wird nicht immer onRestoreInstanceState aufgerufen. onRestoreInstanceState wird nur aufgerufen wenn die App von Android gestoppt wird. Meistens wird in der onRestoreInstanceState(Bundle) einfach nur die Funktion onCreate(Bundle) aufgerufen und der State dort aufgerufen.

7. Die App wird von Android geschlossen

Das kann passieren wenn

Android mehr RAM benötigt
Eine App wie zum Beispiel Android Task Manager die App beendet
In diesem Fall passiert dasselbe wie in Kapitel 6.

8. Die App wird geschlossen und ein Thread läuft

Eine Funktion wird mit dem ThreadPool gestartet. Diese Funktion ruft sich immer wieder selber auf (Schleife). Die Activity wird durch den Back-Button geschlossen.

07-30 15:20:53.563 I/mono-stdout(32215): DoWork Thread
07-30 15:20:55.553 I/mono-stdout(32215): DoWork Thread
07-30 15:20:57.563 I/mono-stdout(32215): DoWork Thread
07-30 15:20:58.643 I/mono-stdout(32215): A OnPause
07-30 15:20:58.803 I/mono-stdout(32215): A OnStop
07-30 15:20:58.883 I/mono-stdout(32215): A OnDestroy | IsFinishing: True
07-30 15:20:59.563 I/mono-stdout(32215): DoWork Thread
07-30 15:21:01.573 I/mono-stdout(32215): DoWork Thread
07-30 15:21:03.563 I/mono-stdout(32215): DoWork Thread

Die Events wie bei einem beenden der Activity werden aufgerufen aber der Thread läuft weiter. Das selber passiert wenn man eine Activity mit this.Finish() beendet.

 

Posted in mono for android, work

Leave a Reply

Your email address will not be published. Required fields are marked *

*


− five = 1

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>