AlarmManager: Planen eines täglichen Alarms und Behandeln von Zeitänderungen
Ich muss täglich zu einer bestimmten Stunde einen Alarm einrichten. Ich programmiere den Alarm mitAlarmManager.RTC_WAKEUP
, so verwendet es die Systemzeit als Referenz. Ich stelle den Alarm so ein, dass er zuerst zur gewünschten Stunde ausgeführt und dann täglich wiederholt wird:
alarmManager.setRepeating(
AlarmManager.RTC_WAKEUP,
getTimestampToday("12:00"),
AlarmManager.INTERVAL_DAY,
pendingIntent
);
DasgetTimestampToday
Methode gibt einen langen Zeitstempel für heute zur gewünschten Stunde zurück. Dazu wird das lokale Datum für den heutigen Tag ermittelt, die gewünschte Stunde eingestellt und schließlich wieder in einen Zeitstempel umgewandelt (der auf der UTC-Zeit basiert).
Das Problem hierbei ist, dass der Alarm gemäß der Ortszeit funktionieren sollte. Wenn sich die Zeit nach dem geplanten Weckalarm ändert (z. B. wenn sich die Sommerzeit ändert oder der Benutzer in ein anderes Land wechselt oder Datum, Uhrzeit oder Zeitzone manuell ändert), wird der Wecker zur falschen Ortszeit ausgelöst nächstes Mal.
Beispiel:
Der Alarm wird um 8:00 Uhr zum ersten Mal ausgelöst und täglich wiederholt (dh 86400 Sekunden Intervall).In dieser Nacht erfolgt eine automatische DST-Zeitumstellung um 3:00 Uhr, wobei die Uhr auf 2:00 Uhr zurückgestellt wird.Am nächsten Morgen wird um 7:00 Uhr ein Alarm ausgelöst, was falsch ist.Die App sollte über einen längeren Zeitraum ausgeführt werden (es handelt sich um eine Kiosk-App, die nur für Unternehmen bestimmt ist). Ich plane die Alarme neu, wenn die App gestartet wird, aber dies löst mein Problem nicht, da die App tagelang ausgeführt werden kann, ohne neu gestartet zu werden. Ich muss erkennen, wann sich die Zeit ändert, um die Alarme wieder gemäß der neuen Ortszeit einzuplanen.
Ich benutze diesen Receiver:
<receiver android:name="foo.bar.receivers.TimeChangeReceiver" >
<intent-filter>
<action android:name="android.intent.action.ACTION_TIMEZONE_CHANGED" />
<action android:name="android.intent.action.ACTION_TIME_CHANGED" />
<action android:name="android.intent.action.DATE_CHANGED"></action>
</intent-filter>
</receiver>
Es erkennt die Änderung des Datums, funktioniert jedoch nicht mit Zeitänderungen oder Zeitzonenänderungen. (Getestet auf einem Tablet mit OS 4.0.3). Es ist wirklich seltsam, weil ich die Ereignisse, die in logcat gesendet werden, deutlich sehen kann.
Also meine Fragen:
Warum sind dieACTION_TIMEZONE_CHANGED
undACTION_TIME_CHANGED
Ereignisse, die von meinem BroadcastReceiver nicht empfangen werden, und wie kann ich das beheben?Würden diese Absichten auch eine DST-Zeitänderung erkennen?Wenn nicht möglich, gibt es einen besseren Ansatz, um Alarme zu Ortszeiten zu programmieren und auf Zeitänderungen zu reagieren?Danke im Voraus.