WakeLock will nicht so wirklich

  • Antworten:6
venni
  • Forum-Beiträge: 89

18.02.2012, 20:37:39 via Website

Hallo zusammen,

mal erneut ein Problemchen :(
Trotz eines Wakelocks scheint meine App irgendwann gekillt zu werden.
Zumindest ist das meine Vermutung, da nach einiger Zeit (nach mehreren Minuten...ca. 10-30 Min.) die Activity wieder im Ausgangzustand steht (nach Aufruf aus der Notification Bar) und offenbar neu gestartet wurde.

Sieht jemand das Problem?

Manifest:
1<uses-permission android:name="android.permission.WAKE_LOCK" />
2<activity android:name="GpsFahrt" android:screenOrientation="portrait" android:launchMode="singleTop"></activity>

Die Activity um die es geht:
1private PowerManager.WakeLock wl;
2
3@Override
4public void onCreate(Bundle savedInstanceState) {
5super.onCreate(savedInstanceState);
6setContentView(R.layout.gps_fahrt);
7PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
8wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "FahrtenbuchWakeLock");
9}
10
11@Override
12 protected void onResume() {
13 // TODO Auto-generated method stub
14 super.onResume();
15 wl.acquire();
16 }
17
18@Override
19 protected void onDestroy() {
20 super.onDestroy();
21 wl.release();
22
23 }

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

19.02.2012, 17:48:50 via Website

Ein WakeLock hat ja auch nichts mit dem Lebenszyklus der Komponenten deiner App und dessen Beeinflussung durch das Betriebssystem zu tun. Er bewirkt lediglich, dass die CPU nicht in den Standby geht...

Antworten
venni
  • Forum-Beiträge: 89

19.02.2012, 19:39:49 via Website

Ich hatte beim PARTIAL_WAKE_LOCK schon die Doku so verstanden dass er Einfluss auf den Lebenszyklus hat.
*If you hold a partial wakelock, the CPU will continue to run, irrespective of any timers and even after the user presses the power button. In all other wakelocks, the CPU will run, but the user can still put the device to sleep using the power button.

&

http://www.vogella.de/blog/2011/02/07/android-wakelock/

Vielleicht auch nur weil ich den "Sleep" Zustand so verstanden habe dass nur in diesem auch eine Activity vom OS zum freigeben von Ressourcen nicht benutzte Apps beendet.
Genau dies dachte ich mit dem PARTIAL_WAKE_LOCK verhindern zu können...habe ich wohl fehlinterpretiert :(

Was wäre dann der richtige Weg so etwas umzusetzen?

— geändert am 19.02.2012, 19:41:06

Antworten
Barrachiel Byzanz
  • Forum-Beiträge: 12

20.02.2012, 15:36:55 via Website

venni
Was wäre dann der richtige Weg so etwas umzusetzen?
Was soll deine App denn machen? Wenn du etwas im Hintergrund machen willst, und den User dann ueber eine Notification anzeigst, dass er die App jetzt wieder aufrufen soll, wäre es wohl am besten wenn du die Logik in ein Service auslagerst und diesem ein PARTIAL_WAKE_LOCK setzt...

Antworten
reiti.net
  • Forum-Beiträge: 339

20.02.2012, 15:54:24 via Website

Manifest.xml -> Activity -> Config Changes

Alles was du dort auswählst handelst du dann in Deiner Activity selbst (onConfigChanged überschreiben)

Standardmäßig wird bei diesen Ereignissen die Activity neu gestartet (also bspw. handy gedreht). Du musst das layout dann selbst neu setzen (setContentView) in onConfigChanged

Mit dem WAKELOCK sagst du Android lediglich, was alles in den Schlafzustand gehen darf und was nicht.

— geändert am 20.02.2012, 15:57:04

Antworten
venni
  • Forum-Beiträge: 89

20.02.2012, 16:15:46 via Website

Ich glaube tatsächlich nach weiterem Lesen dass ein Service der richtige Weg wäre.
Schade nur dass beim Einarbeiten in das GPS-Thema sich die wenigsten mit der dauerhaften Positionsbestimmung zwecks gefahrener Distanz beschäftigt haben. Dann hätte ich es von vorn herein berücksichtigen können.

Naja, ich plane jetzt mal folgendes:

  • Activity die je einen OnClickListener für Start und Ende der Aufzeichnung hat. Dabei prüft die Activity ob der Service bereits läuft. Wenn nicht, ist nur der Button "Start" aktiv. Wenn er schon läuft nur der "Stop" Button
  • Button "Start" startet den Service der die ganze Zeit im Hintergrung die gefahrene Distanz misst und in der Notification Bar darstellt.
  • Beim Click auf das item in der Notification Bar wird die Activity aufgerufen. Dann sollte ja nur der Button "Stop" aktiv sein.
  • Wenn "Stop" geklickt wird, wird eine andere Activity aufgerufen (die in der die Details eingegeben werden), welche sich die gefahrene Distanz des Dienstes, sowie Startdatum und Uhrzeit des Dienststarts (also den Start der Fahrt) und diese Werte nebst des aktuellen Datums/Uhrzeit für das Fahrtende in diese Activity holt und die Werte füllt.

Bessere/andere Ideen oder Vorschläge für die Umsetzung?

Das wird einiges an Einarbeitung kosten wenn man das so rein aus Eigeninteresse nebenbei macht :-(
Aber ich finde das alles trotzdem so interessant das mich das immer wieder beschäftigt...hab ich mir ja selbst ausgesucht :grin:
Und es gibt ja beste Unterstützung hier.
Noch mal vielen Dank an alle die sich bisher beteiligt haben!

Gruß
Frank

Antworten
Barrachiel Byzanz
  • Forum-Beiträge: 12

20.02.2012, 16:31:00 via Website

Zu diesem Zweck ist ein Service tatsächlich der "bessere" Weg - die Beschreibung der Implementierung klingt sehr vernünftig...

Viel Spaß :)

Antworten