onCreate wird während der Laufzeit mehrfach aufgerufen.

  • Antworten:7
Georg Herbrand
  • Forum-Beiträge: 6

07.05.2012, 08:59:50 via Website

Hallo,

ich schreibe eine App, die GPS Koordinaten an einen Server (MySQL) schickt und im Falle keinen Internetverbindung zu haben, in eine SQLITE Datenbank schreibt, die dann - sofern Internet wieder vorhanden - diese Daten auch auf den Server hoch lädt. Funktioniert soweit.

Die Startwerte für einige Parameter sowie der LocationListener und der Datenupload (assynctask) werden in onCreate innitialisiert.

Problem: Wenn ich nun die App in den Hintergrund stelle - z.B. ich ändere die Parameter (WLAN active/inactive) in der Systemsteuerung und dann wieder mit dem app manager wieder in den "Vordergrund" hole, dann:

* werden meine Parameter auf den Startwert gestellt
* meine Werte 2 x 2 fach abgelegt: 2 mal in der SQLITE DB und dann 2 mal in meine MySQL DB hoch geladen. Ich bekomme also meine Werte 4 fach eingetragen.

Ich hätte solch ein Verhalten erwartet, wenn ich die Funktionen in onResume aufgerufen hätte.

Für gute Tipps bin ich unendlich dankbar und würden verhindern, dass ich wahnsinnig werde.

Georg

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

07.05.2012, 09:11:41 via Website

Dann schau dir doch mal die Dokumentation zu Activity an - speziell den Lifecycle.

Es gibt z.B. Methoden, mit denen du den Zustand einer Instanz zwischenspeichern kannst.
onSaveInstanceState und onRestoreInstanceState - auch im onCreate wird ein gespeicherter Zustand übergeben, falls es einen gibt.

So kannst Du dir merken, ob diese spezielle Instanz ihre Arbeit schon getan hat.

Antworten
Georg Herbrand
  • Forum-Beiträge: 6

07.05.2012, 11:14:57 via Website

Ja Danke ... ich habe da wohl immer noch ein Verständnisproblem. Die App wird aufgerufen - alles läuft wie gewollt. Ich verlasse das UI und komme via Application Manager wieder zurück. Dort wird die App als "running" dargestellt. D.h. doch das alle in onCreate initialisierten Werte und aufgerufenen Threads laufen .... das tun sie auch. Wenn ich auf die "running" App" zurückkehre wird diese erneut "gestarted" und die Parameter für die neue Instanz auf anfang gesetzt - Die alte(n) laufen weiter und liefern Werte

Ich kann die Applikation "beliebig oft" starten. Die App läuft mit den jeweils "gesetzten Parametern" weiter und started eine neue "Instanz" - wenn das das richtige Wort ist. Das UI gibt die daten an die jeweils neuste Instanz weiter.

I wead narrisch!

Gruß Georg

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

07.05.2012, 11:19:39 via Website

Guck dir das Zustandsdiagramm an.
In der Doku steht alles drin und der Lifecycle ist ein kritischer Part, den man dringend verstanden haben sollte.

Sobald deine Activity nicht mehr im Vordergrund ist, ist sie eben NICHT mehr running, sonder paused, oder sogar stopped, oder sogar destroyed.
Das entscheidet AndroidOS völlig selbstständig nach Zustand des Systems und entsprechen passieren völlig unterschiedliche Dinge, wenn du die Activity wieder in den Vordergrund holst.

Antworten
Georg Herbrand
  • Forum-Beiträge: 6

07.05.2012, 11:41:42 via Website

das heisst wenn der application manager "running" anzeigt und die App Daten sendet bzw speichert ist sie dennoch "tot" und wird neu gestartet?

die app soll ja durchlaufen - ob im Hintergrund oder nicht - in der Folge müsste ich ja

1. alle Funktionen in Threads (asynctask) packen
2. und in jedem Zustand (onStart, onPause ...) auf Status überprüfen und ggf. canceln und / oder neu starten.

Ist das der weg?

Gruß

Georg

Antworten
Felix
  • Forum-Beiträge: 259

08.05.2012, 00:03:39 via Website

Tach!

Georg Herbrand
das heisst wenn der application manager "running" anzeigt und die App Daten sendet bzw speichert ist sie dennoch "tot" und wird neu gestartet?


Vergiss den Application Manager mal für den Augenblick. Es geht nicht um den Zustand der App als Ganzes sondern um deine Activitys und deren Zustand. Und die leben (oder auch nicht) nach den Regeln des Activity Lifecycle völlig unabhängig voneinander und vom Zustand der App.

Der Activity Lifecycle wird an mehreren Stellen in der Android-Dokumentation behandelt, unter anderem auch in der Activity-Referenz.


Felix.

Antworten
Georg Herbrand
  • Forum-Beiträge: 6

08.05.2012, 07:10:45 via Website

Ok ... wie löse ich dann das Problem?

Die Lösung soll in jedem Zustand GPSDaten erfassen und zuerst in SQLite abspeichern, um sie dann später zu senden. Das tut sie jetzt auch .... sie started sich nur selbst bei Wechsel der Applikation. Ich bekomme also bei 4 Wechseln zur App 5 Einträge in die SQLite Datenbank und 25 Einträge in meine MySQL DB.

Wie schaffe ich es, dass die Activity permanent weiterläuft?

Danke

Georg

Antworten