Handler.postDelay geht nicht, wenn Handy in StandBy

  • Ich hab mich also an mein erstes Android Programm gewagt. Werden soll es ein kleines Tool, dass das Handy für einen bestimmten Zeitraum Stumm schaltet und dann wieder laut schaltet.
    Nachdem ich jetzt die ganze Woche jeden Tag stundenlang die Dokumentation gewälzt habe, bin ich nach viele Rückschlägen doch so weit, dass das Programm soweit fertig ist. Es funktioniert auch soweit, nur hab ich ein Problem von dem ich jetzt keine Ahnung habe, wie ich es lösen soll.


    Um das ganze mal zu beschreiben: Man hat eine Activity in deren GUI man Start und Endzeit festlegen kann. Diese DAten werden dann an einen Service übermittelt, der einen Handler hat, und dort 2 Nachrichten einträgt: Einmal die zum Stummschalten und einmal die zum wieder Laut schalten. Gut, das funktioniert soweit, ich hab schön eine Benachrichtigung in der oberen Leiste, die den aktuellen Status und alles anzeigt, ich kann das Programm vorzeitig beenden und so weiter und so fort. Normalerweise wird auch alles korrekt aufgerufen, und funktioniert, doch nun komme ich zu meinem Problem:


    Manchmal werden die Handlerfunktionen nicht aufgerufen. Ich glaube immer dann, wenn das Handy auf Standby ist (also Bildschirm und so aus), wenn die Nachrichten eigentlich aufgerufen werden sollten. Ich meine auch, dass es sogar immer dann nicht geht, wenn das Handy zwischendurch mal kurz aus war und dann wieder eingeschaltet wird.


    Ich könnte mir vorstellen, dass es am Handler.postDelayed() liegt (dass er im Standby die Millisekunden nicht weiter zählt). Die andere Variante mit Handler.postAt() hat auch irgendwie probleme gemacht, mir ist das mit "Zeit relativ zur Uptime" auch recht suspekt.


    Wie würde ich das ganze jetzt so programmieren, dass es funktioniert?


    Hier noch der Quellcode:
    AutoStumm.java http://pastebin.com/33nepFV5
    AutoStummService.java http://pastebin.com/XAgCeAq9

  • Ja, das liegt daran, dass die uptimeMillis im Standbymodus nicht hochgezählt werden. Alternativen:


    1.) Anstatt Handler einen Alarm über den AlarmManager setzen
    2.) Die CPU über einen WakeLock weiter rechnen lassen (Akku intensiv)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!