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.

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); } 

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() de UpdateAlarmReceiver para confirmar si está recibiendo control en absoluto, o si el problema es ( WakefulIntentService !) Con WakefulIntentService .
  • 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.

  • ¿Qué sucede con AlarmManager no entregado al repetir alarmas cuando el teléfono se despierta?
  • AlarmManager setExact con WakefulBroadcastReceiver a veces no es exacto
  • Notificación de incendio cada 24 horas ya la hora exacta de 8 AM
  • ¿Cómo configurar una alarma de repetición exacta en API 19 (kitkat)?
  • OnReceiver de BroadcastReceiver no llamado, AlarmManager
  • Alarmmanager.setRepeating dispara Inmediatamente
  • AlarmManager en fecha y hora específicas
  • Cómo configurar la alarma en Android?
  • Android AlarmManager a veces se activa tarde si el teléfono se ejecuta en la batería
  • Cómo permitir que el teléfono funcione mientras usa la alarma RTC en Android
  • ¿Cómo comprobar si AlarmManager ya tiene un conjunto de alarmas?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.