WakeLock will einfach nicht!

A

andy572

Ambitioniertes Mitglied
7
Hi @all,

brauche mal wieder Hilfe:

Ich habe einen Service der im Hintergrund läuft, funktioniert (lt. meinem Debug auch).
Dieser basiert auf einem Timer und checkt jede Minute eine Datenbank und vergleicht dort einen Zeitstempel mit der aktuellen Zeit. Trifft dieses auf ein Event zu (es handelt sich hier um einen Kalender den ich gebaut habe) soll der Service innerhalb eines aufenden TimerTask einen Alarmton geben und in der Statusbar eine Notification anzeigen.

Mein Problem: geht das Phone in den Sleep mode, wacht es trotz folgenden Code einfach nicht auf:

Code:
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");
	wl.acquire();
	mNotificationManager.notify(APP_ID, notification);
					
	if( alarm > 0 ) {
		int position = alarm - 1;
		rtmgr.setType(RingtoneManager.TYPE_NOTIFICATION);
		r = rtmgr.getRingtone(position);

		if( r != null ) {
			r.play();
		}
	}
	wl.release();
der code wird in der run() Funktion des TimerTask ausgeführt...

Danke für Eure Hilfe
Andy
 
Dir fehlt noch folgendes Flag:
ACQUIRE_CAUSES_WAKEUP Normal wake locks don't actually turn on the illumination. Instead, they cause the illumination to remain on once it turns on (e.g. from user activity). This flag will force the screen and/or keyboard to turn on immediately, when the WakeLock is acquired. A typical use would be for notifications which are important for the user to see immediately.
 
Danke @the_alien,

leider hilft auch dieses Flag nicht.
Merkwürdig dabei: auf meinem LG P500 funktioniert das ganze (auch ohne dieses Flag), auf dem 2. Handy das meine Frau hat (ein LG GT540) funktioniert es nicht.
Ich nutze die API für Android 2.1, welches auf dem GT540 drauf ist, mein P500 hat Android 2.2 drauf und da geht alles ... Ich verstehe das nicht so ganz :/

Noch komischer dabei:
Solange das USB kabel verbunden ist, funktionierts auf dem GT540 - zieh ich es heraus gehts nimma^^
 
Hmm, Dein Service wird wahrscheinlich vom System gestoppt. Müsstest du mal monitoren per adb, habe den Befehl aber gerade nicht zur Hand. Das passiert auf unterschiedlichen Handys, je mach Speicherauslastung unterschiedlich schnell. Du müsstest den Service als Foregroundservice deklarieren aber das verbraucht viel Akku und ist für Deinen Zweck eigentlich nicht geeignet. Wenn du nur jede Minute etwas abfragst, wären diese Alarmmanager das genau das Richtige.
 
Danke @GMoN,

wie beschrieben: solange das GT540 am USB hängt sehe ich im Debug was er macht und es ist auch alles OK - ziehe ich das Kabel ab, habe ich ja keine Kontrolle mehr, aber es erscheint dann auch weder die Notification noch ist der Ringtone zu hören.

Frage mich dabei, weshalb der Service ohne USB Kabel dann gestoppt werden sollte, klingt für mich nicht verständlich...
 
Also wenn du jede Minute was machen möchtest dann lausche doch mal auf die TIME_TICK Intents. Denn Android-Geräte wachen jede Minute einmal kurz auf und senden dann diese Intents.
 
hab es eben gesehen .... nach wieder anstöpseln und debug lesen sah ich es:
der TIME_TICK fehlt genau in der Ruhephase.

Wie kann ich das effektiv umbauen ? TimerTask rausschmeissen und schauen wie der alarmmanager funktioniert ???
 
Also wenn der TIME_TICK im Standby bei dem Handy fehlt werden aber einige Apps Probleme verursachen. Ist definitiv ein Bug des Geräts. Alternativ könntest du natürlich versuchen den AlarmManager zu nutzen und einen wiederkehrenden Alarm-Intent versenden auf den du lauscht.
 
Sorry, waren zu viele Debug Messages ... man sollte mal einen Filter nutzen^^

Komisch ist jetzt, dass genau DER TIME_TICK um 11:05 fehlt - genau dort sollte mein Alarm losgehen und die Notify angezeigt werden :/


11-23 11:04:00.123: INFO/hs(1812): android.intent.action.TIME_TICK
11-23 11:06:38.663: INFO/hs(1812): android.intent.action.TIME_TICK
11-23 11:07:00.033: INFO/hs(1812): android.intent.action.TIME_TICK
11-23 11:08:00.033: INFO/hs(1812): android.intent.action.TIME_TICK
11-23 11:09:00.073: INFO/hs(1812): android.intent.action.TIME_TICK
11-23 11:10:00.073: INFO/hs(1812): android.intent.action.TIME_TICK
11-23 11:11:00.073: INFO/hs(1812): android.intent.action.TIME_TICK
11-23 11:12:00.043: INFO/hs(1812): android.intent.action.TIME_TICK
11-23 11:13:00.073: INFO/hs(1812): android.intent.action.TIME_TICK
11-23 11:14:00.473: INFO/hs(1812): android.intent.action.TIME_TICK
11-23 11:15:00.073: INFO/hs(1812): android.intent.action.TIME_TICK
11-23 11:16:00.073: INFO/hs(1812): android.intent.action.TIME_TICK
11-23 11:17:00.073: INFO/hs(1812): android.intent.action.TIME_TICK
11-23 11:18:00.073: INFO/hs(1812): android.intent.action.TIME_TICK
 
Naja, du solltest eh überprüfen ob die Zeit gerade genau gleich ist oder ob sie überschritten ist... Sonst bekommst du eh Probleme wenn einmal das Intent nicht kommt oder zu stark verzögert.
 
Ich prüfe ja nicht die Sekunden sondern die Minuten, denke das Zeitfenster sollte also groß genug sein.

Nichts desto trotz habe ich nun auch gesehen, dass der Service eine nette Pause einlegt und während des Standby absolut nix macht ( nach etlichem debuggen konnte ich's dann mal sehen...)
Meine Frage also: wie kann ich den Service am Leben halten ?
 
Hast du es schonmal mit setForeground() probiert?

Code:
[LEFT]final Notification notification = new Notification();[/LEFT]
startForeground(NOTIFICATION_ID, notification);

Ansonsten würd ich mal den AlarmManager probieren. Der Funktioniert bei mir auch beim Ausgeschalteten Bildschirm.
 
Hallo,

andy572 schrieb:
Hi @all,

brauche mal wieder Hilfe:

Ich habe einen Service der im Hintergrund läuft, funktioniert (lt. meinem Debug auch).
Dieser basiert auf einem Timer (...)

Da liegt der Hund begraben, TimerTask erzeugt einen neuen Thread um die Aufgaben auszuführen und der wird dir beim Sleep Modus vom BS gekillt.

TimerTask wird unter Android eh nicht empfohlen aus genau diesem Grund, verwende lieber einen Handler so wird kein neuer Thread erzeugt der dir abschossen werden kann. siehe hier:
Updating the UI from a Timer | Android Developers
Dort geht es zwar um UI Updates, aber da Grundprinzip ist dasselbe.
 
Ich bekomm gleich die Krise mit dem Mist :(

Wie kann ich nun entweder einen Service am Leben halten oder den AlarmManager sinnvoll nutzen ? Andere Apps haben das auch hinbekommen...

Habe jetzt den TimerTask rausgeschmissen und gegen einen AlarmManager ausgetauscht. Super, dass man mit dem aber nur PendingIntents als weiteren Service oder als Activity starten kann. Ich will aber beim eintreffen des Events lediglich eine DB-Abfrage machen, und wenn notwendig eine Notification an den User schicken ... dat kann doch nicht unmöglich sein???
 
Wenn ich das jetzt richtig verstanden habe, würde ich den AlarmManager mit der Zeit bis zum nächsten "Event" setzen. Durch den PendingIntent startest du beim eintreffen des "Alarmes" den Service und erledigst dort deine DB Zugriffe.

Hoffe ich hab das jetzt richtig verstanden.
 
Danke für Eure ganzen Antworten, aber wie ich grad sehe schläft selbst der AlarmManager derweil. Oder sollte ich den besser nicht im Service starten ? Brauch ich dann überhaupt noch einen Service ??? Ich kapier das ganze nun grad nimmer nach 4 Stunden Basteln :/

### EDIT
Nach einem Einbau des AlarmManagers in die Main-Activity wird das PendingIntent nun gar nimm ausgeführt.
 
Zuletzt bearbeitet:
Also normalerweise startet der AlarmManager einen Service. Der AlarmManager wird entweder in einer Activity oder in einem BroadcastReceiver gestartet. (zumindest hab ich das so immer gemacht^^)

aber vllt. fehlt dir nur einfach das flag

Code:
AlarmManager.RTC_WAKEUP


 
Den AlarmManager starte ich in einem Service (onStartCommand):

Code:
AlarmManager am = (AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
		Intent i = new Intent();
		i.setClassName("com.diarycalendar", "com.diarycalendar.alarmReceiver");
		PendingIntent pIntent = PendingIntent.getActivity(this, 0, i, 0);
		long firstPoll = System.currentTimeMillis();
		am.setInexactRepeating(AlarmManager.RTC, firstPoll, PERIOD, pIntent);

So, und nun überlege ich was ich noch falsch machen könnte:
Der Service mit AlarmManager drin wird in der MainActivity gestartet, und das aufgerufene Intent
ist vom Type "Activity". Stelle ich das als Type "Service" ein, wird dieser leider nur 1x aufgerufen - soll aber alle 60 Sekunden ausgeführt werden.
 
Zuletzt bearbeitet:
Weitere Bastelei:

AlarmManager wird wieder von MainActivity gestartet, dieser ruft als PendingIntent nun einen Service auf der die DB-Aktionen ausführt und klingelt.
Macht er auch, solange das Handy am USB hängt. Zieh ich das Kabel ab,
ist wieder alles Tot und der AlarmManager scheint zu pennen... Wat ist das fürn Kack-Handy ????? Da ist noch die n-tv App drauf ... der Service von dem Ding läuft seit dem letzten Reboot - irgendwie muss das doch gehen? Irgendein Flag oder sonst was?

### EDIT:
Hier Motorola Forum wird genau das Problem beschrieben,dass der AlarmManager auf 'nem Android 2.1 in einigen Fällen wohl verbugt ist. So also auch auf dem GT540 :(
 
Zuletzt bearbeitet:

Ähnliche Themen

wernho
Antworten
11
Aufrufe
668
wernho
wernho
SaniMatthias
Antworten
19
Aufrufe
934
swa00
swa00
R
  • Gesperrt
  • roland-senior
Antworten
2
Aufrufe
796
Fulano
Fulano
Zurück
Oben Unten