Android AlarmManager setRepeating no se repite con un intervalo largo
He implementado AlarmManager para activar el teléfono una vez al día para realizar una tarea de actualización, actualizar widgets y enviar notificaciones, si corresponde.
Estoy usando setRepeating
y ELAPSED_REALTIME_WAKEUP
La alarma se activa la primera vez ( SystemClock.elapsedRealtime()+60000
) pero no se dispara 86400000
milisegundos (24 horas) más tarde.
- ¿Hay alguna forma de comprobar si ya está configurada una alarma?
- ¿Cómo configurar más de una alarma a la vez en android?
- Las alarmas set () y setExact () de Android disparan a intervalos incorrectos
- Java.lang.SecurityException:! @Too muchas alarmas (500) registradas de pid 10790 uid 10206
- Desarrollador de Android - Alarm manager vs service
Realmente luchando con esto, estoy feliz de aceptar que estoy haciendo algo mal o si hay mejores maneras de lograr lo que estoy tratando de hacer. Sin embargo, creo que mi código se parece a la gente estándar parece hacer.
Es casi como la alarma de repetición no hace lo que dice que debería en todos los casos. Si reduzco el intervalo para decir 10 minutos funciona, mi alarma dispara y el servicio se ejecuta una y otra vez.
La naturaleza de mi aplicación significa actualizar más de una vez al día es excesivo. Necesito encontrar una solución confiable realista a esto.
Gracias por su tiempo y espero que me puede señalar en la dirección correcta.
Aquí está mi código de implementación de alarma …
Manifiesto:
<receiver android:name=".SystemChangeReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE" /> </intent-filter> </receiver> <receiver android:name=".UpdateAlarmReceiver" /> <service android:name=".UpdateService" /> <receiver android:name=".WidgetProviderSmall" android:label="@string/widget_small_label"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_small" /> </receiver> <receiver android:name=".WidgetProviderLarge" android:label="@string/widget_large_label"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_large" /> </receiver>
SystemChangeReceiver
escucha la emisión de arranque, comprueba si hay que configurar una alarma, si lo hace, lo establece.
SystemChangeReceiver
:
@Override public void onReceive(Context context, Intent intent) { SharedPreferences prefs = context.getSharedPreferences(context.getString(R.string.prefs_name), 0); Boolean notifications = prefs.getBoolean("enable_updates", false); if(notifications == true) { Utils.setNotificationAlarm(context); } }
El método setNotificationAlarm, configura la alarma de repetición …
public static void setNotificationAlarm(Context context) { AlarmManager alarmManager=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, UpdateAlarmReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); alarmManager.setRepeating( AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+60000, 86400000, pi); }
Cuando la alarma dispara mi receptor UpdateAlarmReceiver
decide qué hacer y el uso de WakefulIntentService
ejecuta mi proceso de actualización de fondo, el manejador del servicio a continuación, actualiza widgets y envía notificaciones según sea necesario
UpdateAlarmReceiver
:
public void onReceive(Context context, Intent intent) { WakefulIntentService.sendWakefulWork(context, UpdateService.class); }
- Android AlarmManager disparando en momentos equivocados
- Administrador de alarmas de Android trabajando, pero con retraso
- Ejemplo del Administrador de alarmas
- ¿Cuál es la definición de dormido para un dispositivo Android?
- Confiabilidad del Administrador de alarmas
- Cancelar un AlarmManager pendienteIntent en otro pendienteintent
- AlarmManager borrar todos los horarios en el apagado?
- ¿Cómo guardar la alarma programada después de que la aplicación fue asesinada por Android o asesino de tareas?
No hay nada obviamente mal.
Durante un largo período como este, sin embargo, recomiendo RTC_WAKEUP
, por lo que puede organizar para que se produzca en el medio de la noche o tal vez en un tiempo seleccionable por el usuario, en lugar de cada 24 horas desde un punto de partida semi-al azar . Es posible que RTC_WAKEUP
le dé mejores resultados.
También:
- Agregue una sentencia de registro a
onReceive()
deUpdateAlarmReceiver
para confirmar si está recibiendo control en absoluto, o si el problema es (WakefulIntentService
!) ConWakefulIntentService
. - Trate de aumentar constantemente su período. Dado que usted dice que 10 minutos de trabajo, pruebe una hora, luego cuatro horas, etc, y trate de tener un sentido cuando se rompe.
- "Realmente estoy usando AutoKiller Memory Optimizer no tiene una lista blanca que podría ser el problema? Mi aplicación se ejecuta todavía aunque de acuerdo a la lista de procesos." – Desactivaría todos los asesinos de tareas, sólo para asegurarse de que no están interfiriendo.
¿Has intentado establecerlo para no repetirlo? Entonces, cuando se quema, usted establece la siguiente alarma de disparo único durante 24 horas más tarde? Esto funcionaría como una alarma de repetición pero podría evitar algunos de los problemas que está viendo.