Implementé AlarmManager para reactivar el teléfono una vez al día para realizar una tarea de actualización, actualizar widgets y enviar notificaciones si corresponde.Android AlarmManager setRepetir no se repite con intervalo largo
estoy usando setRepeating
y ELAPSED_REALTIME_WAKEUP
la alarma se activa por primera vez (SystemClock.elapsedRealtime()+60000
) pero no consigue provocó 86400000
milisegundos (24 horas) más tarde.
Realmente estoy luchando con esto, estoy feliz de aceptar que estoy haciendo algo mal o si hay mejores formas de lograr lo que estoy tratando de hacer. Sin embargo, creo que mi código parece ser lo estándar que la gente parece hacer.
Es casi como si la alarma de repetición no hiciera lo que dice que debería en todos los casos. Si reduzco el intervalo para decir 10 minutos, funciona, mi alarma se dispara y el servicio se ejecuta una y otra vez.
La naturaleza de mi aplicación significa que actualizar más de una vez al día es excesivo. Necesito encontrar una solución realista y confiable para esto.
Gracias por su tiempo & espero que pueda señalarme 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
escuchas para la emisión de arranque, comprueba si una alarma se debe establecer, si lo hace, que lo pone.
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, pone en marcha la alarma repitiendo ...
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 se dispara la alarma UpdateAlarmReceiver
mi receptor decide qué hacer y usar WakefulIntentService
corre mi actualización en segundo plano proceso, el controlador para el servicio luego actualiza los widgets y envía las notificaciones según sea necesario
UpdateAlarmReceiver
:
public void onReceive(Context context, Intent intent) {
WakefulIntentService.sendWakefulWork(context, UpdateService.class);
}
Pregunta rápida que puede resolver todo esto: ¿Utiliza un asesino de tareas? ¿Tu aplicación está en la lista blanca? –
En realidad estoy usando AutoKiller Memory Optimizer, no tiene una lista blanca, ¿podría ser el problema? Mi aplicación sigue ejecutándose según la lista de procesos. – Rob