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).
- Excepción al usar ksoap2-android
- Android: "Actualizar automáticamente" después de un tiempo determinado
- Instanciar con una clase Pool <T> a través de la interfaz PoolObjectFactory
- Servicio de Android para PubNub
- Subclase serializable de clase padre no serializable
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:
- Alarma configurada para disparar primero a las 8:00 AM, repetir cada día (lo que significa 86400 segundos de intervalo).
- Esa noche, un cambio automático de horario de verano sucede a las 3:00 AM, cambia el reloj 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 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
yACTION_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.
- Error de generación de Gradle con java 1.8, herramienta de compilación 2.2.0-alpha4, habilitar jackOptions
- Sube fotos de la aplicación de Android a Google Cloud Storage / App Engine - carácter ilegal '_'
- No puedo hacer un nuevo nuevoRequestQueue en Volley, android
- Excepción de Android TagHandler
- Convertir una cadena de fecha en milisegundos en java
- Valor de Json Parsing y Nullable int en android
- Datos de servicio web de caché de android
- Es posible cambiar el nombre de la hoja con apache poi MS excel java android
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?
- Diferencia en la representación de la imagen sobre la versión androide diferente
- ¿Cómo hacer algo repetidamente mientras se presiona un botón?