AlarmManager: как запланировать ежедневный будильник и справиться с изменениями времени
Мне нужно установить будильник ежедневно в определенный час. Я программирую будильник, используяAlarmManager.RTC_WAKEUP
, поэтому он использует системное время в качестве ссылки. Я устанавливаю будильник, чтобы сначала включить в нужный час, а затем повторять ежедневно:
alarmManager.setRepeating(
AlarmManager.RTC_WAKEUP,
getTimestampToday("12:00"),
AlarmManager.INTERVAL_DAY,
pendingIntent
);
getTimestampToday
Метод возвращает длинную временную метку на сегодняшний день в нужный час. Это делается путем получения локальной даты на сегодня, затем установки нужного часа и, наконец, преобразования его обратно в метку времени (которая основана на UTC).
Проблема здесь в том, что будильник должен работать по местному времени. Таким образом, если время изменилось после того, как был запланирован будильник (например, изменение времени летнего времени, или пользователь переехал в другую страну, или он вручную изменил дату, время или часовой пояс), то будильник сработает в неправильное местное время. в следующий раз.
Пример:
Будильник установлен на первый огонь в 8:00 утра, повторять ежедневно (означает интервал 86400 секунд).Той ночью автоматическое изменение времени перехода на летнее время происходит в 3:00 утра, переводит часы обратно на 2:00 утра.На следующее утро будильник срабатывает в 7:00, что неправильно.Приложение предназначено для работы в течение длительного времени (это приложение для киосков только для корпоративного использования). Я перепланирую сигналы тревоги при запуске приложения, но это не решает мою проблему, потому что приложение может работать в течение нескольких дней без перезапуска. Мне нужно определить, когда время меняется, чтобы снова планировать тревоги в соответствии с новым местным временем.
Я использую этот приемник:
<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>
Он обнаруживает изменение даты, но не работает с изменениями времени и часовых поясов. (Протестировано на планшете под управлением ОС 4.0.3). Это действительно странно, потому что я ясно вижу события, транслируемые в logcat.
Итак, мои вопросы:
ПочемуACTION_TIMEZONE_CHANGED
а такжеACTION_TIME_CHANGED
события, не полученные моим BroadcastReceiver, и как я могу их решить.Будут ли эти намерения определять изменение времени летнего времени?Если это невозможно, есть ли лучший подход к программированию сигналов тревоги по местному времени и работе с изменениями времени?Заранее спасибо.