android - notification - Cómo configurar AlarmManager recurrente para ejecutar el código diariamente
create alarm android (2)
Esto está funcionando, disparará la alarma cada 5 segundos.
private void setRecurringAlarm() {
Logger.d(IConstants.DEBUGTAG, "Setting Recurring Alarm");
Calendar updateTime = Calendar.getInstance();
updateTime.set(Calendar.SECOND, 5);
Intent alarmIntent = new Intent(this, AlarmReceiver.class);
PendingIntent recurringDownload = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager alarms = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarms.cancel(recurringDownload);
alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, updateTime.getTimeInMillis(), 1000 * 5, recurringDownload); //will run it after every 5 seconds.
}
Actualmente estoy intentando escribir un administrador de alarmas que haga sonar una alarma en un período de tiempo específico, diariamente. Primero verifico si el usuario ha configurado una alarma para ese día:
if ((User.getReminderTime(Home.this) > 0)
&& (dt.getDate() != today.getDate() || dt.getDay() != today
.getDay())) {
AppointmentManager.setFutureAppointmentCheck(this
.getApplicationContext());
User.setLongSetting(this, "futureappts", today.getTime());
}
Luego voy y configuro la alarma real para que suene entre las 12 y las 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 configuro un entorno de prueba para que esto se active cada dos minutos y parece que funciona bien, sin embargo, cuando lo implemento en un dispositivo real, el receptor no parece estar recibiendo las alarmas. Pensé que podría ser un problema con el dispositivo dormido, así que agregué el administrador de energía. Pero todavía 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 descaradamente mal o estoy haciendo esto incorrectamente? Gracias por cualquier y toda la ayuda.
Normalmente hago algo más en la línea de:
Intent i = new Intent(this, MyService.class);
PendingIntent pi = PendingIntent.getService(this, 0, i, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.cancel(pi); // cancel any existing alarms
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_DAY,
AlarmManager.INTERVAL_DAY, pi);
De esta manera, no tiene que preocuparse por restablecer el AlarmManager
en su Service
.
Normalmente ejecuto este bit de código cuando mi aplicación se inicia ( onResume
en mi actividad principal) y en un BroadcastReceiver
que está configurado para recibir BOOT_COMPLETED
.
He escrito una guía sobre la creación de Service
y el uso del AlarmManager
, que se basa en mi propia experiencia y en algunos consejos y trucos que deseché al ver una conversación de Google I / O. Si estás interesado, puedes leerlo here .
Para responder a su pregunta a continuación, todo lo que puedo hacer es citar los documentos :
public void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
Programe una alarma de repetición que tenga requisitos de tiempo de activación inexactos; por ejemplo, una alarma que se repite cada hora, pero no necesariamente en la parte superior de cada hora. Estas alarmas son más eficientes en el consumo de energía que las repeticiones estrictas suministradas por setRepeating (int, long, long, PendingIntent), ya que el sistema puede ajustar la fase de las alarmas para que se activen simultáneamente, evitando que el dispositivo se despierte del modo de espera más de lo necesario.
El primer activador de su alarma no será antes del tiempo solicitado, pero es posible que no se produzca durante casi un intervalo completo después de ese tiempo. Además, mientras que el período total de la alarma de repetición será según lo solicitado, el tiempo entre dos disparos sucesivos de la alarma puede variar. Si su aplicación requiere un jitter muy bajo, use setRepeating (int, long, long, PendingIntent) en su lugar.
En conclusión, no está muy claro. Los documentos solo dicen que la alarma "puede variar". Sin embargo, debería ser importante para usted saber que el primer desencadenante podría no ocurrir durante casi un intervalo completo después de ese tiempo .