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, и как я могу их решить.Будут ли эти намерения определять изменение времени летнего времени?Если это невозможно, есть ли лучший подход к программированию сигналов тревоги по местному времени и работе с изменениями времени?

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

Ответы на вопрос(1)

Ваш ответ на вопрос