1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

WakeLock will einfach nicht!

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von andy572, 23.11.2010.

  1. andy572, 23.11.2010 #1
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    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
     
  2. the_alien, 23.11.2010 #2
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Dir fehlt noch folgendes Flag:
     
  3. andy572, 23.11.2010 #3
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    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^^
     
  4. GMoN, 23.11.2010 #4
    GMoN

    GMoN Android-Lexikon

    Beiträge:
    1,134
    Erhaltene Danke:
    131
    Registriert seit:
    01.02.2009
    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.
     
  5. andy572, 23.11.2010 #5
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    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...
     
  6. dereulenspiegel, 23.11.2010 #6
    dereulenspiegel

    dereulenspiegel Android-Hilfe.de Mitglied

    Beiträge:
    105
    Erhaltene Danke:
    4
    Registriert seit:
    16.08.2009
    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.
     
  7. andy572, 23.11.2010 #7
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    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 ???
     
  8. dereulenspiegel, 23.11.2010 #8
    dereulenspiegel

    dereulenspiegel Android-Hilfe.de Mitglied

    Beiträge:
    105
    Erhaltene Danke:
    4
    Registriert seit:
    16.08.2009
    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.
     
  9. andy572, 23.11.2010 #9
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    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
     
  10. the_alien, 23.11.2010 #10
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    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.
     
  11. andy572, 23.11.2010 #11
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    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 ?
     
  12. Stefan Baumgartner, 23.11.2010 #12
    Stefan Baumgartner

    Stefan Baumgartner Neuer Benutzer

    Beiträge:
    19
    Erhaltene Danke:
    2
    Registriert seit:
    20.10.2010
    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.
     
  13. Scavanger, 23.11.2010 #13
    Scavanger

    Scavanger Junior Mitglied

    Beiträge:
    28
    Erhaltene Danke:
    8
    Registriert seit:
    26.06.2010
    Phone:
    Samsung Galaxy Note 4
    Hallo,

    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.
     
  14. andy572, 23.11.2010 #14
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    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???
     
  15. Stefan Baumgartner, 23.11.2010 #15
    Stefan Baumgartner

    Stefan Baumgartner Neuer Benutzer

    Beiträge:
    19
    Erhaltene Danke:
    2
    Registriert seit:
    20.10.2010
    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.
     
  16. andy572, 23.11.2010 #16
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    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: 23.11.2010
  17. Stefan Baumgartner, 23.11.2010 #17
    Stefan Baumgartner

    Stefan Baumgartner Neuer Benutzer

    Beiträge:
    19
    Erhaltene Danke:
    2
    Registriert seit:
    20.10.2010
    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


     
  18. andy572, 23.11.2010 #18
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    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: 23.11.2010
  19. andy572, 23.11.2010 #19
    andy572

    andy572 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    5
    Registriert seit:
    05.09.2010
    Phone:
    Samsung Galaxy S3
    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: 23.11.2010

Diese Seite empfehlen