AlarmManager: cómo programar una alarma diaria y lidiar con los cambios de hora

Necesito configurar una alarma diariamente a una hora determinada. Estoy programando la alarma usandoAlarmManager.RTC_WAKEUP, por lo que utiliza la hora del sistema como referencia. Estoy configurando la alarma para que primero se ejecute a la hora deseada, luego para repetirla a diario:

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

losgetTimestampToday El método devuelve una marca de tiempo larga para hoy a la hora deseada. Lo hace obteniendo la fecha local de hoy, luego configurando la hora deseada y finalmente convirtiéndola de nuevo en una marca de tiempo (que se basa en UTC).

El problema aquí es que la alarma debe funcionar de acuerdo con la hora local. Entonces, si la hora cambió después de que se programó la alarma (por ejemplo, el horario de DST, o si el usuario va a un país diferente, o si cambia la fecha, la hora o la zona horaria manualmente), la alarma se activará a la hora local incorrecta. la próxima vez.

Ejemplo:

La alarma está configurada para el primer disparo a las 8:00 AM, repita diariamente (lo que significa 86400 segundos de intervalo).Esa noche, un cambio automático de horario de DST ocurre a las 3:00 AM, y el reloj vuelve a las 2:00 AM.A la mañana siguiente, la alarma se dispara a las 7:00 AM, lo cual es incorrecto.

La aplicación está diseñada para funcionar durante largos períodos de tiempo (es una aplicación de kiosco solo para uso corporativo). Estoy volviendo a programar las alarmas cuando se inicia la aplicación, pero esto no resuelve mi problema, porque la aplicación puede ejecutarse durante días sin que se reinicie. Necesito detectar cuándo cambia la hora para programar las alarmas nuevamente de acuerdo con la nueva hora local.

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

Detecta el cambio de fecha, pero no funciona con los cambios de hora ni con los cambios de zona horaria. (Lo probé en una tableta con OS 4.0.3). Es realmente extraño, porque puedo ver claramente los eventos que se emiten en Logcat.

Así que mis preguntas:

Por que son losACTION_TIMEZONE_CHANGED yACTION_TIME_CHANGED eventos que no están siendo recibidos por mi BroadcastReceiver, y cómo podría resolverlos.¿Podrían estos intentos detectar también un cambio de hora DST?Si no es posible, ¿hay un mejor enfoque para programar alarmas en horarios locales y lidiar con cambios de hora?

Gracias por adelantado.

Respuestas a la pregunta(1)

Su respuesta a la pregunta