Callbackmethoden des Activity Lebenszyklus

  • Antworten:3
Gelöschter Account
  • Forum-Beiträge: 3

07.08.2010, 01:21:24 via Website

Hallo,

Ich beschäftige mit dem Lebenszyklus von Activities. Die Callbackmethoden onCreate(), on Start(), onResume(), onPause(),..., onDestroy() bieten einem ja die Möglichkeit auf Zustandsänderungen einer Activity zu reagieren, in dem man sie in seiner Activity überschreibt. Nun werden sie, so weit ich das verstanden habe, vom UI-Thread der Applikation (auch main Thread genannt) in der die Activity läuft aufgerufen. Oder?

(Hier: http://developer.android.com/guide/topic…html#procthread wird dazu folgendes gesagt: "All components are instantiated in the main thread of the specified process, and system calls to the component are dispatched from that thread. Separate threads are not created for each instance. Consequently, methods that respond to those calls — methods like View.onKeyDown() that report user actions and the lifecycle notifications discussed later in the Component Lifecycles section — always run in the main thread of the process.")

Aber wer sagt dem UI-Thread, wann er diese Methoden aufrufen soll? Oder verwaltet er das alles alleine? Das OS muss doch die Events, die der Benutzer verursacht oder die im Sytem auftreten und die einen Zustandswechsel meiner Activity zur Folge haben, abfangen und in irgendeiner Form an den UI-Thread übermitteln. Zum Beispiel führt ein drücken des Home-Buttons während die Activity sich im Zustand running/aktive befindet dazu, dass zunächst onPause() und dann onStop() aufgerufen werden. Gibt es dann so etwas wie eine Message oder ein Runable Object, dass in die Message Queue des UI-Threads gelegt wird? Oder wie sieht der Benachrichtigungsmechanimus aus?
Kann mir jemand erklären, wie das abläuft?

Danke für eure Hilfe

Antworten
Tobias Eckert
  • Forum-Beiträge: 155

07.08.2010, 10:46:19 via Website

Hallo Coco,

Das erledigt alles das Betriebssystem für Dich. Du kannst von Deiner App aus ja auch weitere Threads bauen, für diese bestimmte Methoden definieren, den Thread von Deiner App aus starten und diese Methoden aufrufen.

Genauso macht das Android. Du kannst Dir das so vorstellen dass das Android Betriebssystem nichts weiter ist als eine App die beim Einschalten des Telefons gestartet wird, und die dann andere Apps laden und starten kann. Wenn eine App geladen wird, wird deren main Thread gestartet. Zu bestimmten Systemevents werden dann die Standard-Routinen dieses Threads wie onCreate() oder onPause() vom Betriebssystem aufgerufen.

KeyEvents werden ebenfalls erst vom System ausgewertet bevor sie an die gerade aktive App weiter gereicht werden. Das System entscheidet dabei was an die App gegeben wird und was nicht. So wird zum Beispiel ein Druck auf den "Back" Button an die App weiter gegeben, ein Druck auf die "Home" Taste aber nicht. Deshalb kannst Du in Deiner App die Funktion der "Back" Taste ändern, die der "Home" Taste aber nicht, weil Du vom Betriebssystem gar nicht gesagt bekommst wenn diese gedrückt wurde.

Antworten
Gelöschter Account
  • Forum-Beiträge: 3

09.08.2010, 22:32:02 via Website

Danke für deine Hilfe.

Wie genau sorgt denn das Betriebssystem dafür dass der Thread z.B. die Methode MyActivity.onCreate() aufruft? Kriegt der UI Thread ein Runnable oder eine Message oder was anderes, das ihm sagt, dass er diese Methode ausführen soll?
In der Android Dokumentation steht nur: "All components are instantiated in the main thread of the specified process, and system calls to the component are dispatched from that thread." .

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

10.08.2010, 08:07:37 via Website

Ob und wie ein Prozess durch Deine App gestartet wird, sagst Du dem OS mit Hilfe der Angaben in Deinem Manifest, genau so wie es in dem von Dir verlinkten Artikel auch beschrieben steht.

Die von Dir gemachten Angaben sorgen bei App-Start dafür, dass Deine App im Context der für die App bei der Installation durch den Package Manager vergebenen UID oder Shared UID läuft. Um Deine App herum liegt quasi ein Wrapper, der sich um die Entgegennahme und Weiterleitung von System-Ereignissen kümmert.

Läuft also Deine App und es kommt ein Anruf herein, dann startet dieser Wrapper bspw. automatisch die onPause Methode Deiner Activity und in Folge die onStop Methode. Kümmerst Du Dich dort um das Speichern von Werten, ist gut .. wenn nicht is auch gut. Ist der Call beendet, hat Deine App die Chance in der ebenso automatisch aufgerufenen onRestart Methode Deiner App diese evtl. zuvor gesicherten Werte wieder herzustellen und genau dort weiterzumachen wo sie vorher unterbrochen wurde.

Dabei ist es völlig egal ob Du diese Methoden implementierst, also überschreibst oder nicht. Existieren diese nicht in Deiner App werden nur leere Dummy - Rümpfe des umgebenden Wrappers ausgeführt. Existieren die Methoden in Deiner App delegiert der Wrapper die Abarbeitung an die von Dir implementierten Methoden weiter und tritt danach wieder in den Wrapper ein.

lg Voss

Antworten