AlarmManager: jak zaplanować codzienny alarm i poradzić sobie ze zmianami czasu
Muszę codziennie uruchamiać alarm o określonej godzinie. Programuję alarm za pomocąAlarmManager.RTC_WAKEUP
, więc używa czasu systemowego jako odniesienia. Ustawiam alarm, aby najpierw był wykonywany w żądanej godzinie, a następnie powtarzam codziennie:
alarmManager.setRepeating(
AlarmManager.RTC_WAKEUP,
getTimestampToday("12:00"),
AlarmManager.INTERVAL_DAY,
pendingIntent
);
ThegetTimestampToday
metoda zwraca długi znacznik czasu na dzisiaj o żądanej godzinie. Robi to, uzyskując lokalną datę na dziś, a następnie ustawiając żądaną godzinę, w końcu konwertując ją z powrotem na znacznik czasu (który jest oparty na UTC).
Problem polega na tym, że alarm powinien działać zgodnie z czasem lokalnym. Jeśli więc czas zmieni się po zaplanowaniu alarmu (na przykład zmiana czasu DST lub użytkownik uda się do innego kraju lub zmieni datę, godzinę lub strefę czasową ręcznie), wówczas alarm uruchomi się z niewłaściwym czasem lokalnym następnym razem.
Przykład:
Alarm ustawiony na pierwszy ogień o 8:00, powtarzaj codziennie (co oznacza 86400 sekund interwału).Tej nocy automatyczna zmiana czasu DST ma miejsce o 3:00 rano, przesuwa zegar z powrotem do 2:00.Następnego ranka alarm uruchamia się o 7:00, co jest błędem.Aplikacja ma działać przez długi czas (jest to aplikacja kioskowa przeznaczona wyłącznie do użytku korporacyjnego). Ponownie planuję alarmy podczas uruchamiania aplikacji, ale to nie rozwiązuje mojego problemu, ponieważ aplikacja może działać przez kilka dni bez ponownego uruchamiania. Muszę wykryć, kiedy czas się zmieni, aby zaplanować alarmy zgodnie z nowym czasem lokalnym.
Używam tego odbiornika:
<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>
Wykrywa zmianę daty, ale nie działa ze zmianami czasu ani zmianami stref czasowych. (Przetestowałem go na tablecie z systemem OS 4.0.3). To jest naprawdę dziwne, ponieważ wyraźnie widzę, że wydarzenia transmitowane są w logcat.
Więc moje pytania:
Dlaczego sąACTION_TIMEZONE_CHANGED
iACTION_TIME_CHANGED
wydarzenia, które nie zostały odebrane przez odbiorcę transmisji i jak mogę je rozwiązać.Czy te zamiary również wykryją zmianę czasu DST?Jeśli nie jest to możliwe, czy istnieje lepsze podejście do programowania alarmów w czasie lokalnym i radzenia sobie ze zmianami czasu?Z góry dziękuję.