AlarmManager: как планировать ежедневную тревогу и обрабатывать изменения времени

Мне нужно настроить будильник ежедневно в определенный час. Я программирую сигнал тревоги с помощью AlarmManager.RTC_WAKEUP , поэтому он использует системное время в качестве ссылки. Я устанавливаю будильник для первого запуска в нужный час, а затем повторяю ежедневно:

  alarmManager.setRepeating( AlarmManager.RTC_WAKEUP, getTimestampToday("12:00"), AlarmManager.INTERVAL_DAY, pendingIntent ); 

Метод getTimestampToday возвращает длинную getTimestampToday метку на сегодняшний день в желаемый час. Он делает это, получив локальную дату на сегодняшний день, затем установив желаемый час и, наконец, переведя его обратно в метку времени (которая основана на UTC).

Проблема здесь в том, что будильник должен работать в соответствии с местным временем. Поэтому, если время изменилось после того, как запланирована тревога (например, изменение времени DST или пользователь переходит в другую страну или он изменяет дату, время или часовой пояс вручную), тогда будильник будет срабатывать в неправильное местное время в следующий раз.

Пример:

  1. Тревога, установленная для первого стрельбы в 8:00, повторяется ежедневно (т.е. 86400 секунд интервала).
  2. В ту ночь автоматическое изменение времени DST происходит в 3:00 AM, сдвигает часы до 2:00 AM.
  3. На следующее утро будильник срабатывает в 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). Это действительно странно, потому что я могу ясно видеть события, которые транслируются в логарифме.

Поэтому мои вопросы:

  • Почему события ACTION_TIMEZONE_CHANGED и ACTION_TIME_CHANGED не принимаются моим BroadcastReceiver и как я могу его решить.
  • Могут ли эти намерения также определять изменение времени DST?
  • Если это невозможно, есть ли лучший подход к программным аварийным сигналам в местное время и справляться с изменениями времени?

Заранее спасибо.

    Вы должны использовать

     <action android:name="android.intent.action.TIMEZONE_CHANGED" /> <action android:name="android.intent.action.TIME_SET" /> 

    Вместо

      <action android:name="android.intent.action.ACTION_TIMEZONE_CHANGED" /> <action android:name="android.intent.action.ACTION_TIME_CHANGED" /> 

    См. ACTION_TIMEZONE_CHANGED и ACTION_TIME_CHANGED . И обратите внимание на значение, данное для этих констант.


    И для изменений DST читается ли Android AlarmManager обрабатывает переход на летнее время?