Ein Android Wecker

Ich dachte mir es wäre ziemlich cool einen Wecker wie den Phillips Wake-Up Light zu bauen. Jedoch ist es meinen Elektrotechnik Kenntnisse nicht so gut bestellt und wenn es darum geht ICs herauszusuchen und Widerstände zu berechnen dachte ich mir man könnte das ganze ja auch mit einem Smartphone (bei mir ein Nexus 4) ansteuern. Dafür muss man aber irgendwie dem Android OS mitteilen, dass es in der Zukunft zu einem gewissen Zeitpunkt den Wecker startet. Die Lösung dazu heißt AlarmManager.

AlarmManager

Der Android AlarmManager ist eine System Resource und startet einen Intent, genauer gesagt einen Pending Intent zu einem gewissen Zeitpunkt. Zum testen und um dieses Beispiel Einfach zu halten soll einfach nur ein weißer Bildschirm mit der Aufschrift „Aufstehen“ angezeigt werden.

Als erstes Erstellen wir eine einfache Activity wo eine Uhrzeit eingegeben werden kann. Ein klick auf einen Button soll den AlarmManager mitteilen das er das Pending Intent zu der eingegebenen Zeit starten soll.

main.xml

AlarmMainActivity.java

gehen wir die Zeilen einmal im Detail durch:

Alles wesentliche spielt sich in der Methode onCreate  ab, also wenn die Anwendung gestartet wird. zunächst werden der Intent  und der PendingIntent initialisiert. Der Intent  bekommt Verweise auf die aktuelle Activity  und die Klasse der zu startenden Activity  mit. Der Intent  soll jedoch nicht direkt ausgeführt werden sondern später, also wird dieser in einen PendingIntent eingebettet. Die zwei interessantesten Parameter sind 12345, was man als eine ID für den PendingIntent auffassen und frei wählen kann. Gibt es bereits einen solchen Intent kommt Parameter Nr.4:  PendingIntent.FLAG_CANCEL_CURRENT ins Spiel. Dieser Flag zeigt an, dass ein schon existierender Pending Intent zunächst abgebrochen wird um diesen zu starten. Ob ein solcher bereits existiert wird über die ID erkannt.

Dann wird dem Speichern-Button ein Handler zugewiesen. Dieser liest die 2 Textfelder aus und wandelt die Werte in Ganzzahlen um. In der Kalender Instanz ( wakeupTime ) werden die Werte nun gesetzt. Die Sekunden und Millisekunden werden auf 0 gesetzt, wer sehr pünktlich aufstehen will kann diese Werte natürlich auch noch abfragen 😉 . Die folgende if -Abfrage ist ziemlich wichtig. Es soll ja vorkommen, dass jemand seinen Wecker um 20:00 Abends auf 6:00 Morgens stellt. Das heißt wir müssen den den nächsten Tag wählen. Andererseits kann es aber auch sein, dass der Wecker um 20:00 auf 22:00 eingestellt wird. Dann soll der Tag unverändert bleiben.

Zu guter letzt fordern wir den AlarmManager vom Betriebssystem an und teilen diesem mit, dass unsern PendingIntent zu der in wakeTime  eingestellten Zeit gestartet werden soll. AlarmManager.RTC_WAKEUP  bedeutet, dass das Gerät aus dem Schlafmodus geholt wird. Praktisch heißt es das sich der Bildschirm einschaltet.

Jetzt fehlt nur noch der Intent der gestartet werden soll:

alarm.xml

 AlarmReceiverActivity.java

Hier wird nicht wirklich viel gemacht. Es wird bloß eine weiße Seite mit dem Text „Aufstehen“ angezeigt.

Um alles zusammenzufügen benötigt man noch ein Android Manifest:

AndroidManifest.xml

Das ganze Projekt als ZIP zum Import für Eclipse: AlarmManager

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.