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.