AlarmManager: cómo programar una alarma diaria y hacer frente a cambios de tiempo

Necesito configurar una alarma diariamente a una hora determinada. Estoy programando la alarma usando AlarmManager.RTC_WAKEUP , por lo que usa la hora del sistema como referencia. Estoy configurando la alarma para ejecutar primero a la hora deseada, luego para repetir diariamente:

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

El método getTimestampToday devuelve una marca de tiempo larga para hoy a la hora deseada. Lo hace mediante la obtención de la fecha local para hoy, a continuación, establecer la hora deseada, finalmente convertirlo de nuevo a una marca de tiempo (que es UTC basado).

El problema aquí es que la alarma debería funcionar según la hora local. Por lo tanto, si el tiempo cambia después de programar la alarma (por ejemplo, el cambio de hora de hora de verano, o el usuario va a un país diferente, o cambia la fecha, la hora o la zona horaria manualmente), la alarma se disparará en la hora local incorrecta. la próxima vez.

Ejemplo:

  1. Alarma configurada para disparar primero a las 8:00 AM, repetir cada día (lo que significa 86400 segundos de intervalo).
  2. Esa noche, un cambio automático de horario de verano sucede a las 3:00 AM, cambia el reloj a las 2:00 AM.
  3. 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 ejecutarse durante largos períodos de tiempo (es una aplicación de quiosco sólo para uso corporativo). Estoy re-programación de las alarmas cuando se inicia la aplicación, pero esto no soluciona mi problema, porque la aplicación puede ejecutarse durante días sin ser reiniciado. Necesito detectar cuándo cambia el horario 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 cambios de hora ni cambios de zona horaria. (Probado en una tableta que ejecuta OS 4.0.3). Es realmente extraño, porque puedo ver claramente los eventos que se transmiten en logcat.

Así que mis preguntas:

  • ¿Por qué los eventos ACTION_TIMEZONE_CHANGED y ACTION_TIME_CHANGED no han sido recibidos por mi BroadcastReceiver y cómo podría solucionarlo.
  • ¿Estos intentos también detectarían un cambio de hora DST?
  • Si no es posible, ¿existe un mejor enfoque para programar alarmas en los horarios locales y tratar con cambios de tiempo?

Gracias por adelantado.

Deberías usar

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

En lugar de

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

Consulte ACTION_TIMEZONE_CHANGED y ACTION_TIME_CHANGED . Y observe el valor dado para estas Constantes.


Y para los cambios de horario de verano lee ¿Android AlarmManager maneja los cambios de horario de verano?

  • Cargador de imágenes asíncronas en listview
  • XML vs setImageDrawable / setImageBitmap
  • Detener una ejecución en un hilo independiente
  • SearchView escucha voces
  • Comportamiento anormal al usar proguard
  • AndroidPlot: elimina los valores de dominio de GraphWidget
  • Java 7/8 en Android?
  • ¿Cuándo usar actores en libgdx? ¿Cuáles son contras y pros?
  • ERROR: debe implementar OnFragmentInteractionListener
  • ¿Cómo puedo convertir datos JSON presentes en una URL en una cadena JSON en java o android?
  • ¿Qué puede ser una causa de java.net.SocketException: recvfrom falló: ETIMEDOUT?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.