Die wichtigsten Aktivitätsereignisse unter Android
Eine Aktivität definiert verschiedene Methoden, die dann unter bestimmten Umständen vom Betriebssystem aufgerufen werden. Einige dieser Methoden werden aufgerufen, wenn sich der Zustand der Aktivität verändert. Die Signaturen solcher Methoden nennen wir auch Aktivitätsereignisse.
Zustände
Aktiv
Eine Anwendung, die sich im Vordergrund befindet ist aktiv.
Pausiert
Eine Anwendung ohne Fokus, die aber noch (teilweise) sichtbar ist, pausiert.
Unter anderem wird eine aktive Anwendung pausiert, wenn das Gerät in den Schlafzustand geht.
Gestoppt
Eine Anwendung, die nicht mehr sichtbar ist, ist gestoppt.
Aktivitätsereignisse
Das folgende Diagramm zeigt die wichtigsten Aktivitätsereignisse. Ihre Namen beginnen jeweils mit »on«.
Oft tritt ein Aktivitätsereignis ein, wenn sich der Zustand einer Aktivität verändert. Durch die Implementation eines Ereignisses kann eine Aktivität festlegen, wie sie auf eine Zustandsänderung reagiert.
Die Existenz einer Aktivität beginnt im Diagramm oben bei »Aktivitaet ist gestartet« und folgt dann den Pfeilen.
Weitere Erklärungen zu den Aktivitätsereignissen finden sich auch weiter unten.
- Die wichtigsten Aktivitätsereignisse
.--------------.
.' '.
| Aktivitaet |
| ist gestartet |
'. .'
'--------------'
|
Gestoppt/ V
created Initialisiert .------------------.
created | .------------------>| onCreate() |
created | | '------------------'
created | | |
created Pausiert/ | V
paused Sichtbar | .------------------. .------------------.
paused | | | | onStart() |<----------------| onRestart() |
paused | | | '------------------' '------------------'
paused | | | | ^
paused | | | .<-------------------. |
paused | | | | bundle == null | |
paused | | | | V |
paused | | | | .--------------------------. |
paused | | | | | onRestoreInstanceState() | |
paused | | | | '--------------------------' |
paused | | | | | |
paused | | | '------------------->| |
paused | | Benutzer navigiert | |
paused | | zur Aktivitaet V |
paused | Aktiv/ ^ .------------------. |
resumed |Vordergrund | | onResume() |<-------------. |
resumed | | | | '------------------' | |
resumed | | | | | | |
resumed | | | | V | |
resumed | | | .--------------. .--------------. | |
resumed | | | .' '. .' '. | |
resumed | | | |Aktivitaetsprozess| | Aktivitaet | | |
resumed | | | | ist beendet | | laeuft | | |
resumed | | | '. .' '. .' | |
resumed | | | '--------------' '--------------' | |
resumed | | | ^ | | |
resumed | | | | V | |
resumed | | | | Eine andere Aktivitaet Benutzer kehrt |
resumed | | | | kommt in den Vordergrund zur Aktivitaet |
resumed | | | | | zurueck |
resumed | | | | V ^ |
resumed | | | Apps mit hoeherer .------------------. | |
paused | | Prioritaet benoetigen | onPause() |--------------' |
paused | | Speicher '------------------' |
paused | | | | |
paused | | | | : |
paused | | | | .-----------------------. |
paused | | | | | onSaveInstanceState() | |
paused | | | | '-----------------------' |
paused | | | | : |
paused | | | V V |
paused | | | Die Aktivitaet ist Benutzer navigiert
paused | | | nicht mehr sichtbar zur Aktivitaet
paused | | | | |
paused | | | V |
paused | | | .-----------------. |
paused | | '-------------------| onStop() |----------------------------'
created | '-----------------'
created | |
created | V
created | Die Aktivitaet ist
created | beendet oder vom System
created | aufgeloest worden
created | |
created | .----------------------------'
created | | |
created | | V
| .-----------------.
| | onDestroy() |
| '-----------------'
| |
'--------------------------->|
|
V
.--------------.
.' '.
| Aktivitaet |
| ist geschlossen |
'. .'
'--------------'- Quellen
https://developer.android.com/guide/components/activities/activity-lifecycle.html
developer.android.com/reference/android/app/Activity.html
Signaturen
Falls eine der folgenden Methoden überschrieben wird, soll dabei immer die gleichnamige Methode der Oberklasse aufgerufen werden.
Einigen Informationen zum Übergang zwischen verschiedenen Zuständen können dem obigen Diagramm entnommen werden. Diese Informationen werden im folgenden nicht noch einmal alle wiederholt.
»onCreate()«
Diese Methode muß von einer App überschrieben werden, um die App zu initialisieren. Hier wird die sichtbare Fläche der Anwendung mit »setContentView(int)« angelegt.
Der Parameter ist entweder ein zuvor gespeichertes Bündel (falls eine Aktivität wiederhergestellt wird) oder der Wert »null« (falls eine neue Aktivität erzeugt wird). In dem Bündel speichert das System beim Beenden einer Aktivität (in »SaveInstanceState()«) automatisch einige Informationen über die Benutzeroberfläche, wie beispielsweise den Text in Textfeldern, die eine Kennung (»android:id«) haben.
»onStart()«
Diese Methode macht die Aktivität sichtbar und muß normalerweise nicht überschrieben werden.
»onResume()«
Diese Methode wird aufgerufen, wenn die Interaktion mit dem Benutzer beginnt.
»onPause()«
Diese Methode wird aufgerufen, wenn die direkte Interaktion mit dem Benutzer unterbrochen wird, beispielsweise, wenn sie von einer Dialog-Aktivität teilweise verdeckt wird.
Hier könnten beispielsweise Wiedergaben von Medien angehalten oder teure Ressourcen freigegeben werden.
Da »onPause()« relativ oft aufgerufen wird und Aktivitäten, die (verdeckend) über unserer Aktivität erscheinen sollen, auf die Beendigung von »onPause()« warten müssen, bevor sie erscheinen könnem, sollten in »onPause()« keine langdauernden Aktionen erfolgen. Diese sollten vielmehr in »onStop()« erfolgen.
Hier können Änderungen als gültig eingetragen werden.
»onStop()«
Diese Methode wird aufgerufen, wenn die Aktivität gestoppt (vollständig unsichtbar) wird.
Hier können Daten gespeichert werden, auch wenn die Speicheroperationen zeitaufwendig sind. An dieser Stelle sind noch alle Informationen der Aktivität vorhanden.
Hier sollten alle noch besessenen Ressourcen freigegeben werden. (Dies kann nicht in »onDestroy()« geschehen, da »onDestroy()« nicht immer aufgerufen wird.)
Falls die Aktivität von hier aus wieder sichtbar wird, wird »onRestart()« aufgerufen, bevor die übliche Sequenz von Zuständen wieder bei »onStart()« beginnt.
»onDestroy()«
Die Aktivität wird aufgelöst, beispielsweise durch einen Aufruf von »finish()« (»isFinishing()« ist »true«) oder weil das System Platz braucht (»isFinishing()« ist »false«) oder die Gerätekonfiguration (beispielsweise die Geräteorientierung, Sprachen oder Eingabegeräte) sich ändert (»isFinishing()« ist »false«).
»onSaveInstanceState()«
Hier speichert das System beim Beenden einer Aktivität automatisch einige Informationen über die Benutzeroberfläche, wie beispielsweise den Text in Textfeldern, die eine Kennung (»android:id«) haben.
Diese Methode wird aber nicht immer aufgerufen und kann daher nicht verwendet werden, um allgemein Daten der Anwendung zu speichern.
Hier sollte »super.onSaveInstanceState(savedInstanceState);« am Ende ausgeführt werden.
»onRestoreInstanceState«
Erhält dasselbe Bündel wie »onCreate«. Da diese Methode aber nur aufgerufen wird, wenn auch ein Bündel zum Wiederherstellen vorhanden ist, kann die Bündelreferenz hier nicht »null« sein.
Übungsaufgaben
/ Übungsaufgabe
Erstellen Sie eine App, die es erkennen läßt, wann eine bestimmte ihrer folgenden Methoden aufgerufen wurde.
- »onCreate«,
- »onStart«,
- »onRestoreInstanceState«,
- »onResume«,
- »onPause«,
- »onStoreInstanceState«,
- »onStop« und
- »onDestroy«
Dabei sollte nicht nur die zuletzt aufgerufene Methode angezeigt werden, sondern eine Liste mit mindesten den zehn zuletzt aufgerufenen Methoden.
Beobachten Sie damit dann die Sequenz von Aufrufen
- Beim Start der App,
- beim Drehen des Gerätes,
- beim Verlassen der App mit der Taste „zurück“,
- beim Beenden des Prozesses der App.