Mobile App Development - Alarm -
Inhalt Alarme AlarmManger Wake locks 2
Alarm
Alarm Oft ist es notwendig eine App zu starten, auch wenn der Benutzer nicht mit ihr interagiert Starten von Activities zu bestimmten Zeitpunkten zyklisches Starten von Services Realisierung über Alarme 4
Alarm Beim Erstellen eines Alarms muss man sich verschiedene Fragen stellen Erwachen Soll das Gerät erwachen, um den Alarm auszuführen? Wiederholung Soll der Alarm nur einmal ausgeführt oder wiederholt werden? 5
Alarm Beim Erstellen eines Alarms muss man sich verschiedene Fragen stellen Genauigkeit Ist es notwendig, dass der Alarm zum exakten Zeitpunkt ausgeführt wird oder kann er etwas verschoben werden? Muss der Alarm zur Realzeit ausgeführt werden oder reicht eine relative Zeit? 6
Alarm Beim Erstellen eines Alarms muss man sich verschiedene Fragen stellen Ereignis Was soll passieren, wenn der Alarm ausgelöst wird. Soll eine Activity, ein Service oder ein BroadcastReveiver gestartet werden? 7
Alarm In Android kann zwischen verschiedenen Systemzeiten unterscheiden werden real time elapsedtime uptime 8
Alarm real Time Realzeit, ist die vergangene Zeit seit dem 01.01.1970 analog zu Standard Java Achtung: Kann vom Benutzer verändert werden und sollte daher mit Vorsicht verwendet werden 9
Alarm up time gibt die Zeit seit dem letzten System Boot an enthält nicht die Zeit, die das System im Schlafmodus verbracht hat unabhängig von Benutzereinstellungen 10
Alarm elapsed time gibt die Zeit an, die seit dem letzten System Boot vergangen ist enthält auch die Zeit, die im Schlafmodus verbracht wurde unabhängig von Benutzereinstellungen 11
AlarmManager
AlarmManager Durch den AlarmManager erhält man Zugriff auf den Android AlarmService Er ermöglicht die zeitgesteuerte Ausführung von Programm Code 13
AlarmManager Alarm erstellen public void createalarm(view view) {!! // AlarmManager vom System abrufen */! AlarmManager mng = (AlarmManager)!!!!! getsystemservice(context.alarm_service);!! /* Hier wird die Komponente eingetragen, die als Action! ausgeführt werden soll */! Intent intent = new Intent(this, TestActivity.class);! /* Erstellen eines PendingIntents für eine Activity */! PendingIntent pi = PendingIntent.getActivity(this, 0, intent,!!! PendingIntent.FLAG_UPDATE_CURRENT);!! /* Alarm setzen */! mng.set(alarmmanager.elapsed_realtime,!!!! SystemClock.elapsedRealtime() + PERIOD, pi);!! } 14
AlarmManager AlarmManager.set() Parameter Alarm Typ Ausführungszeit Aktion 15
AlarmManager Alarm Typ ELAPSED_REALTIME Basis ist die elapsed time, Gerät wird nicht aus deep sleep aufgeweckt ELAPSED_REALTIME_WAKEUP wie oben, nur dass das Geräte aus dem deep sleep aufgeweckt wird, wenn der Alarm ausgelöst wird 16
AlarmManager Alarm Typ RTC Basis ist die Realzeit, Gerät wird nicht aus deep sleep aufgeweckt RTC_WAKEUP wie oben, nur dass das Geräte aus dem deep sleep aufgeweckt wird, wenn der Alarm ausgelöst wird 17
AlarmManager Ausführungszeit Zeitpunkt, an dem der Alarm ausgeführt werden soll abhängig vom Alarm Typ: elapsed oder real time in Millisekunden 18
AlarmManager PendingIntent die eigentliche Aktion, die bei Einsetzen des Alarm ausgeführt werden soll Starten einer Activity, eines Services oder eines BroadcastReceivers als Aktion 19
AlarmManager Wiederholenden Alarm erstellen public void createalarm(view view) {!! // AlarmManager vom System abrufen */! AlarmManager mng = (AlarmManager)!!!!! getsystemservice(context.alarm_service);!! // PendingIntent als auszuführende Aktion erstellen! PendingIntent pi = creatependingintent();!! /* Alarm setzen, der periodisch wiederholt wird */! mng.setrepeating(alarmmanager.elapsed_realtime,!!!! SystemClock.elapsedRealtime() + PERIOD, PERIOD, pi);! } 20
AlarmManager Ungenaue Alarme Bei einem ungenauen Alarm versucht Android das WakeUp mit anderen Alarmen aus Energiespargründen zusammen zu legen D. h. der Alarm wird u. U. nicht genau zu angegebenen Zeitpunkt ausgeführt 21
AlarmManager Ungenauen Alarm erstellen public void createinexactalarm(view view) {!! // AlarmManager vom System abrufen */! AlarmManager mng = (AlarmManager)!!!!! getsystemservice(context.alarm_service);!! // PendingIntent als auszuführende Aktion erstellen! PendingIntent pi = creatependingintent();!! /* Alarm setzen, der periodisch wiederholt wird */! mng.setinexactrepeating(alarmmanager.elapsed_realtime,!!!! SystemClock.elapsedRealtime() + PERIOD,!!!! AlarmManager.INTERVAL_HOUR, pi);! } 22
AlarmManager Ungenauen Alarm erstellen setinexactrepeating() erhält die gleichen Parameter, wie die Methode setrepeating() nur die Periode wird in Form von AlarmManager.INTERVAL_XXX Kostanten angegeben 23
AlarmManager Alarm abbrechen public void cancelalarm(view view) {!!! /* Referenz auf den AlarmManger abrufen */!! AlarmManager mng = (AlarmManager) getsystemservice(alarm_service);!!! /* Alarme werden abgebrochen, indem man den PendingIntent,!! mit dem sie erstellt wurden, angibt */!! mng.cancel(creatependingintent());!! } 24
Wake locks
Wake locks Problemstellung Wenn ein Gerät in den Schalfmodus (deep sleep) geht, werden ausführende Prozesse angehalten Wie kann also verhindert werden, dass Hintergrundprozesse angehalten werden bzw. das Gerät in den Schlafmodus geht? 26
Wake locks Wake locks... werden verwendet, um das System daran zu hindern, in den Schlafmodus zu gehen 27
Wake locks Arten von Wake locks (API 7) CPU Screen Keyboard PARTIAL On On Off SCREEN_DIM On Dim Off SCREEN_BRIGHT On Bright Off FULL On Bright Bright Quelle: http://developer.android.com/reference/android/os/powermanager.html#full_wake_lock 28
Wake locks Wake locks verwenden Um Wack locks setzen zu können, wird die Berechtigung WAKE_LOCK benötigt <?xml version="1.0" encoding="utf-8"?>! <manifest xmlns:android="..."! package="de.htwds.emrolab.mada.alarm"! android:versioncode="1"! android:versionname="1.0" >!! <uses-permission android:name="android.permission.wake_lock"/>!! <application>... </application>!! </manifest> 29
Wake locks Wake locks verwenden! private void createwakelock(context context) {!!! /* Referenz auf den PowerManager abrufen */!!! PowerManager pm = (PowerManager)!!!!! context.getsystemservice(context.power_service);!!! /* Erzeugen eines partial wake locks */!!! WakeLock lock = pm.newwakelock(!!!!! PowerManager.PARTIAL_WAKE_LOCK, "my.debug.tag");!!! /* Setzen des Wake locks */!!! lock.acquire();!!!!!! /* auszuführender Code */!!!!!! /* Freigabe des Wake locks*/!!! lock.release();!! } 30
Wake locks Wake locks belasten die Gerätebatterie zusätzlich Sie sollten nur dann verwendet werden, wenn sie unbedingt gebraucht werden Ein Wake-Lock sollte so schnell wie möglich wieder freigegeben werden 31
Literatur I. Sven Haiges: Android Schnelleinstieg entwickler.press, 2011 II. Mark L. Murphy: The Busy Coder s Guide To Android Development, Version 4.3, 2012