WakeLock/PowerManager fragen..

  • Antworten:10
  • Bentwortet
Michele
  • Forum-Beiträge: 1.525

03.08.2013, 15:24:01 via Website

Hallo alle zusammen.

So viele Apps haben WakeLock/PowerManager laufen.
Z.B WhatsApp,Youtube,Facebook & Co.

Die frage ist, am welchen Punkt setze ich das am besten? Oder wo haben die Programmierer wie für WhatsApp das am besten gesetzt?
In einem Service? In der Activity? Was ist wenn es keine Activity gibt, sondern eine Widget App ist?

Ich habe es für meine Widget App z.B so gesetzt:

1public PowerManager.WakeLock wakeLock;
2 public PowerManager pm;
3
4 @Override
5 public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
6 super.onUpdate(context, appWidgetManager, appWidgetIds);
7
8 pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
9 wakeLock = pm.newWakeLock(pm.PARTIAL_WAKE_LOCK, "My wakelook");
10 wakeLock.acquire();
11
12 }

Aber woher soll ich wissen das meine App wirklich nicht dann in den Standby Modus geht und mein WakeLock funktioniert.
Soll ich es lieber zur Sicherheit in einem Service setzen?

Wie macht ihr das für eure Apps, wenn ihr es braucht?


LG

Antworten
Andy N.
  • Forum-Beiträge: 3.112

03.08.2013, 21:19:54 via Website

Ich würde es da rein setzen, wo auch die Logok steckt, die den Wakelock braucht.

Ist es zum Beispiel ein MP3-Player, dann im Service, der die Musik abspielt.

Michele

Antworten
Michele
  • Forum-Beiträge: 1.525

03.08.2013, 22:12:23 via Website

Andy N.
Ich würde es da rein setzen, wo auch die Logok steckt, die den Wakelock braucht.

Ist es zum Beispiel ein MP3-Player, dann im Service, der die Musik abspielt.

Hallo Andy.

Danke dir erstmal für den Tipp.
Stimmt auch wieder. Aber ich dachte der WakeLock hält die "ganze" App am "Leben".
Ich habe in meiner Widget z.B mehrere Service laufen. Und doppelt oder mehrere für jeden Service kann ich kein WakeLock nehmen.
Das gibt ärger dann laut LogCat.


EDIT: Hatte dazu diese fehler meldung im LogCat:
1A/PowerManager: WakeLock finalized while still held: AppWidgetWakeLock


LG

— geändert am 03.08.2013, 22:50:30

Antworten
JekApps
  • Forum-Beiträge: 19

04.08.2013, 20:53:50 via Website

Michele
Andy N.
Ich würde es da rein setzen, wo auch die Logok steckt, die den Wakelock braucht.

Ist es zum Beispiel ein MP3-Player, dann im Service, der die Musik abspielt.

Hallo Andy.

Danke dir erstmal für den Tipp.
Stimmt auch wieder. Aber ich dachte der WakeLock hält die "ganze" App am "Leben".
Ich habe in meiner Widget z.B mehrere Service laufen. Und doppelt oder mehrere für jeden Service kann ich kein WakeLock nehmen.
Das gibt ärger dann laut LogCat.


EDIT: Hatte dazu diese fehler meldung im LogCat:
1A/PowerManager: WakeLock finalized while still held: AppWidgetWakeLock


LG

Ein WakeLock hält nicht nur die ganze App sondern das ganze Smartphone wach. Daher macht es gar keinen Sinn mehrere wakelocks gleichzeitig zu starten.
Wann du es tun solltest , kommt sehr auf die Funktion an, für die du den WakeLock benötigst.
Bei einem MP3 Player sollte man ihn z.b. nur setzen, wenn Musik abgespielt wird und beenden, wenn die Musik stoppt oder pausiert wird.

Michele

Antworten
Michele
  • Forum-Beiträge: 1.525

04.08.2013, 21:09:39 via Website

Hallo JekApps.

Danke dir für deine Antwort.

Das Error was ich hier gepostet habe von der LogCat kam wohl davon, weil ich es in der AppWidgetProvider Klasse gesetzt
habe. In einem Service oder mehrere passiert das nicht.

Wozu ich das brauche? Um die gesteuerte Animation am leben zu erhalten für meine Widget.


LG

Antworten
JekApps
  • Forum-Beiträge: 19

05.08.2013, 01:19:09 via Website

Michele
Hallo JekApps.

Danke dir für deine Antwort.

Das Error was ich hier gepostet habe von der LogCat kam wohl davon, weil ich es in der AppWidgetProvider Klasse gesetzt
habe. In einem Service oder mehrere passiert das nicht.

Wozu ich das brauche? Um die gesteuerte Animation am leben zu erhalten für meine Widget.


LG

Die gesteuerte Animation? Du meinst du hast ein animiertes Widget?

Antworten
Michele
  • Forum-Beiträge: 1.525

05.08.2013, 01:26:33 via Website

https://play.google.com/store/apps/details?id=com.nick.freetamago&hl=de

Sowas programmiere ich gerade.

In der App ist WakeLock auch. Oder müsste.
Siehe Berechtigungen von der App.

Deswegen. Geht meine App in den Standby Modus, so stoppt die Animation und alles einfach.
Keine Buttons, nichts mehr geht.

Mit WakeLock klappt alles soweit super.
Ich wusste halt nur nicht wohin ich das setzen soll.


LG

— geändert am 05.08.2013, 01:30:58

Antworten
JekApps
  • Forum-Beiträge: 19

05.08.2013, 01:36:23 via Website

Michele
https://play.google.com/store/apps/details?id=com.nick.freetamago&hl=de

Sowas programmiere ich gerade.

In der App ist WakeLock auch. Oder müsste.
Siehe Berechtigungen von der App.

Deswegen. Geht meine App in den Standby Modus, so stoppt die Animation und alles einfach.
Keine Buttons, nichts mehr geht.

Mit WakeLock klappt alles soweit super.
Ich wusste halt nur nicht wohin ich das setzen soll.


LG

Wakelocks haben eigentlich nicht den Sinn eine spezielle App wach zu halten, sondern das ganz Gerät, d.h. WLAN, CPU etc gehen nicht in den Stromsparmodus, wenn das Display ausgeht.
Dein Widget muss aber doch auch nur animiert und kontrollierbar sein, während das Display an ist.

Wenn du dein Widget über einen Service kontrollierst, der auch weiter "lebt", wenn sich deine Acivities beenden, solltest du meiner Meinung nach keinen Wakelock brauchen...

Antworten
Michele
  • Forum-Beiträge: 1.525

05.08.2013, 02:00:23 via Website

Eine Activity benutze ich garnicht. Rein Widget.

Das Problem ist. Sobald das Display aus ist also Standby ist, bleibt die Animation stehen. Oder der Service.
Und geht nicht mehr an oder fängt wieder an weiter zulaufen, wenn das Display an ist.
Die Animation läuft in einem Service. Die muss ja ewig laufen.

Habe ja schon vor langer Zeit hier das Problem gepostet.
Mir wurde gesagt ich soll WakeLock nehmen.

Seit dem Funktioniert auch alles soweit gut.


LG

— geändert am 05.08.2013, 02:02:28

Antworten
impjor
  • Forum-Beiträge: 1.793

05.08.2013, 13:26:50 via App

Hast du bei deinem Service die onStartCommand(...)-Methode überschrieben und START_STICKY zurückgegeben? Dann sollte es auch ohne WakeLock funktionieren. (Jedenfalls tut es das bei mir.)
Allerdings kann nichts Android davon abhalten deinen Service zu beenden (bei Speicherknappheit), außer du erstellst eine Notification in der Statusbar und rufst startForeground auf.
Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Michele
  • Forum-Beiträge: 1.525

05.08.2013, 15:01:55 via Website

Ich habe meine onStart Methode überschrieben und da alles soweit drin.

Weiß ehrlich gesagt auch gar nicht was der unterscheid zwischen onStart und onStartCommand ist.
Leider noch nicht weiter mit befasst.

Bei mir sollte es wohl auch nun ohne WakeLock Methode Funktionieren.
Da ich ein guten Trick mir aus gedacht habe.

Meine Animation wird durch geführt.
Animation ist ende dann.
Dann wir der AlarmManager aufgerufen.
Dann wird mit stopSelf(); der Service geschlossen und wieder Sekunden später
neu aufgerufen vom BroadcastReceiver und dem AlarmManager wie angegeben
und dann wird wieder neu die Animation gestartet.
So dürfe es keine Probleme geben mit der Speicherknappheit oder etc.
Zu mindestens läuft die App schon 2 Tage ohne Probleme.
Zu mindestens auf Jelly Beans Handys.
Bei einigen ICS Handys bleibt es trotzdem mal stecken.

Und das mit startForeground hat damals bei mir nichts gebracht und möchte ich auch eigentlich nicht nutzen.
Da ich selbst noch keine App erlebt habe wo ständig eine Notification in der Statusbarleiste klebt.


Danke dir impjor und den Rest nochmal.


LG

— geändert am 05.08.2013, 15:11:45

Antworten