Actualmente estoy tratando de escribir gestor de alarma que hará que una alarma se apaga en un plazo determinado de tiempo, todos los días. En primer lugar comprobar para ver si el usuario ha tenido un ajuste de la alarma de que para ese día:Cómo conjunto recurrente AlarmManager ejecutar código diaria
if ((User.getReminderTime(Home.this) > 0)
&& (dt.getDate() != today.getDate() || dt.getDay() != today
.getDay())) {
AppointmentManager.setFutureAppointmentCheck(this
.getApplicationContext());
User.setLongSetting(this, "futureappts", today.getTime());
}
entonces voy y ajustar la alarma para que suene real entre el 12 y 12:10 del día siguiente:
public static void setFutureAppointmentCheck(Context con) {
AlarmManager am = (AlarmManager) con
.getSystemService(Context.ALARM_SERVICE);
Date futureDate = new Date(new Date().getTime() + 86400000);
Random generator = new Random();
futureDate.setHours(0);
futureDate.setMinutes(generator.nextInt(10));
futureDate.setSeconds(0);
Intent intent = new Intent(con, FutureAppointmentReciever.class);
PendingIntent sender = PendingIntent.getBroadcast(con, 0, intent,
PendingIntent.FLAG_ONE_SHOT);
am.set(AlarmManager.RTC_WAKEUP, futureDate.getTime(), sender);
}
Ahora puedo configurar un entorno de prueba para que esto se apaga cada dos minutos y parece estar funcionando bien, sin embargo, cuando despliego a un dispositivo real, no parece ser el receptor de recibir a las alarmas. Pensé que podría ser un problema con el dispositivo de estar dormido, por lo que añade el gestor de energía. Pero aún así no funciona:
PowerManager pm = (PowerManager) context
.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, "keepAlive");
wl.acquire();
setFutureAppointments(context.getApplicationContext());
AppointmentManager.setFutureAppointmentCheck(context
.getApplicationContext());
User.setLongSetting(context.getApplicationContext(), "futureappts",
new Date().getTime());
wl.release();
Alguien ve algo que estoy haciendo mal o descaradamente voy de esta manera incorrecta? Gracias por cualquier y toda la ayuda.
Creo que un servicio puede ser más de lo que necesito para lo que estoy haciendo, pero su blog era una buena lectura! ¿Sabes por casualidad cuánto offset es el SetInexactRepeating usualmente? – ninjasense
Edité mi respuesta para explicar el problema 'setInexactRepeating'. – Felix
como bonificación, en lugar de cancelar antes de configurar uno nuevo, puede recuperar el PendingIntent con PendingIntent.FLAG_CANCEL_CURRENT como último parámetro, que tiene el mismo efecto. – nsL