AlarmManager: como agendar um alarme diário e lidar com mudanças de horário

Eu preciso configurar um alarme diariamente a uma determinada hora. Estou programando o alarme usandoAlarmManager.RTC_WAKEUP, então ele usa a hora do sistema como referência. Estou configurando o alarme para primeiro executar na hora desejada, depois para repetir diariamente:

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

ogetTimestampToday método retorna um registro de data e hora longo para hoje na hora desejada. Ele faz isso obtendo a data local para hoje e, em seguida, definindo a hora desejada, finalmente convertendo-a de volta em um timestamp (que é baseado em UTC).

O problema aqui é que o alarme deve funcionar de acordo com a hora local. Portanto, se o horário mudou depois que o alarme foi agendado (por exemplo, alteração do horário de verão ou se o usuário for para outro país ou alterar manualmente a data, a hora ou o fuso horário), o alarme disparará no horário local errado. próxima vez.

Exemplo:

Alarme configurado para o primeiro disparo às 8:00 da manhã, repita diariamente (significando 86400 segundos de intervalo).Naquela noite, uma mudança automática de horário de verão acontece às 3:00 da manhã, muda o relógio de volta para 2:00 da manhã.Na manhã seguinte, o alarme dispara às 7:00, o que está errado.

O aplicativo está destinado a ser executado por longos períodos de tempo (é um aplicativo de quiosque apenas para uso corporativo). Estou reordenando os alarmes quando o aplicativo é iniciado, mas isso não resolve meu problema, porque o aplicativo pode ser executado por dias sem ser reiniciado. Preciso detectar quando a hora muda para programar os alarmes novamente de acordo com a nova hora local.

Eu estou usando este receptor:

    <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>

Ele detecta a mudança de data, mas não funciona com alterações de horário nem alterações de fuso horário. (Testado em um tablet rodando OS 4.0.3). É realmente estranho, porque eu posso ver claramente os eventos sendo transmitidos no logcat.

Então minhas perguntas:

Por que oACTION_TIMEZONE_CHANGED eACTION_TIME_CHANGED eventos não sendo recebidos pelo meu BroadcastReceiver e como eu poderia resolvê-lo.Essas intenções também detectariam uma mudança de horário no horário de verão?Se não for possível, existe uma abordagem melhor para programar alarmes em horários locais e lidar com mudanças de horário?

Desde já, obrigado.

questionAnswers(1)

yourAnswerToTheQuestion