AlarmManager: Wie man einen täglichen Alarm plant und mit Zeitänderungen umgeht

8

Ich muss täglich zu einer bestimmten Uhrzeit einen Alarm einstellen. Ich programmiere den Alarm mit AlarmManager.RTC_WAKEUP , also verwendet er die Systemzeit als Referenz. Ich stelle den Alarm so ein, dass er zuerst zur gewünschten Stunde ausgeführt wird und dann täglich wiederholt wird:

%Vor%

Die Methode getTimestampToday gibt einen langen Zeitstempel für den heutigen Tag zur gewünschten Stunde zurück. Dazu wird das lokale Datum für heute abgerufen, dann die gewünschte Stunde eingestellt und schließlich in einen Zeitstempel umgewandelt (der auf UTC basiert).

Das Problem hier ist, dass der Alarm entsprechend der Ortszeit funktionieren sollte. Wenn sich die Zeit also nach der Planung des Alarms ä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 Alarm zur falschen Ortszeit ausgelöst Das nächste Mal.

Beispiel:

  1. Der Alarm wird um 8:00 Uhr morgens ausgelöst und täglich wiederholt (dh 86400 Sekunden Intervall).
  2. In dieser Nacht findet um 3:00 Uhr eine automatische Änderung der Sommerzeit statt und die Uhr wird auf 2:00 Uhr zurückgestellt.
  3. Am nächsten Morgen wird der Wecker um 7:00 Uhr ausgelöst, was falsch ist.

Die App soll über einen längeren Zeitraum laufen (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 das löst mein Problem nicht, da die App Tage lang ohne Neustart ausgeführt werden kann. Ich muss erkennen, wann sich die Zeit ändert, um die Alarme entsprechend der neuen Ortszeit erneut zu planen.

Ich benutze diesen Empfänger:

%Vor%

Er erkennt die Datumsänderung, funktioniert aber nicht mit Zeitänderungen oder Zeitzonenänderungen. (Getestet auf einem Tablet mit OS 4.0.3). Es ist wirklich merkwürdig, denn ich kann deutlich sehen, dass die Ereignisse in logcat übertragen werden.

Also meine Fragen:

  • Warum werden die Ereignisse ACTION_TIMEZONE_CHANGED und ACTION_TIME_CHANGED nicht von meinem BroadcastReceiver empfangen und wie kann ich das Problem lösen?
  • Würden diese Absichten auch eine Änderung der Sommerzeit erkennen?
  • Wenn es nicht möglich ist, gibt es einen besseren Ansatz, um Alarme zu lokalen Zeiten zu programmieren und Zeitänderungen zu behandeln?

Vielen Dank im Voraus.

    
Mister Smith 17.10.2013, 08:24
quelle

1 Antwort

6

Sie sollten

verwenden %Vor%

Anstelle von

%Vor%

Siehe ACTION_TIMEZONE_CHANGED und ACTION_TIME_CHANGED . Und beobachten Sie den Wert für diese Konstanten.

Und für DST-Änderungen lesen Handelt Android AlarmManager Sommerzeit Änderungen?

    
Pankaj Kumar 17.10.2013, 09:11
quelle