AlarmManager activa PendingIntent demasiado pronto

He buscado por 3 días ahora pero no encontré una solución o un problema / pregunta similar en cualquier otro lugar. Aquí está el trato:

Disparo en 1 hora -> funciona correctamente

Disparador en 2 horas -> Goes of in 1:23

Disparador en 1 día -> Pasa de ~ 11: 00

Entonces, ¿por qué AlarmManager es tan impredecible y siempre demasiado pronto? ¿O qué estoy haciendo mal? ¿Y hay otra manera para que funcione correctamente?

Esta es la forma en la que registro mi PendingIntent en el AlarmManager (despojado):

AlarmManager alarmManager = (AlarmManager)parent.getSystemService(ALARM_SERVICE); Intent myIntent = new Intent(parent, UpdateKlasRoostersService.class); PendingIntent pendingIntent = PendingIntent.getService(parent, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); //Set startdate of PendingIntent so it triggers in 10 minutes Calendar start = Calendar.getInstance(); start.setTimeInMillis(SystemClock.elapsedRealtime()); start.add(Calendar.MINUTE, 10); //Set interval of PendingIntent so it triggers every day Integer interval = 1*24*60*60*1000; //Cancel any similar instances of this PendingIntent if already scheduled alarmManager.cancel(pendingIntent); //Schedule PendingIntent alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, start.getTimeInMillis(), interval, pendingIntent); //Old way I used to schedule a PendingIntent, didn't seem to work either //alarmManager.set(AlarmManager.RTC_WAKEUP, start.getTimeInMillis(), pendingIntent); 

Sería increíble si alguien tiene una solución. ¡Gracias por cualquier ayuda!

Actualización: Hace 2 horas que funcionó para disparar con un intervalo de 2 horas, pero después de que se disparó después de 1:20 horas. Se está poniendo muy raro. Seguiré los disparadores con un archivo de registro y lo publicaré aquí mañana.

Actualización: El PendingIntent está programado para ejecutarse cada 3 horas. De la segunda línea del registro parece que un PendingIntent programado viejo sigue funcionando:

 [2012-5-3 2:15:42 519] Updating Klasroosters [2012-5-3 4:15:15 562] Updating Klasroosters [2012-5-3 5:15:42 749] Updating Klasroosters [2012-5-3 8:15:42 754] Updating Klasroosters [2012-5-3 11:15:42 522] Updating Klasroosters 

Pero, estoy seguro que cancelé el PendingIntent programado antes de programar un nuevo. Y cada PendingIntent no se recrea de la misma manera, por lo que debe ser exactamente el mismo. Si no, esta pregunta hilos no es más relevante.

Cuando se utiliza un calendario se tiene en cuenta que el calendario utiliza el tiempo hasta Milli segundos. Tal vez debería establecer el segundo campo Milli y el campo de segundos a cero por lo que va de en el punto.

También por un día sería más fácil usar esto

 Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(0); cal.add(Calendar.DAY_OF_MONTH, 1); 

También cuando se utiliza getInstance no establece que los calendarios de tiempo a la hora en que se creó por lo que no debería haber ninguna necesidad de establecer el tiempo de nuevo a la derecha?

Reescribir : Finalmente vi tu error, pero de manera impredecible.

Yo cambié esto:

 PendingIntent.getService(parent, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

a esto:

 PendingIntent.getService(parent, 0, myIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

Bajo la misma suposición que usted que de alguna manera una vieja intención está transmitiendo. No he visto la casualidad desde …

También las únicas veces que lo vi fue durante mi llamada inicial. Otro enfoque podría ser rastrear un objeto current y un objeto previous Calendar, si el intervalo no es lo que esperaba, ignore esta difusión "temprana". (Si bien este método parece redundante teniendo en cuenta cómo debe funcionar la alarma, ayuda a prevenir esas llamadas externas teniendo en cuenta cómo funciona la alarma …)

Espero que ayude, te haré saber si encuentro algo más.

Sé que esta pregunta es un poco vieja, pero tenía este mismo problema yo mismo. Descubrí que si intentaba declarar la variable Calendar fuera del método, no funcionaría bien y las alarmas se dispararían temprano. Debido a que su clase está despojada, es difícil saber exactamente dónde está llamando la instancia del calendario.

Si lo configuro como tal, entonces se dispararía justo a tiempo:

 protected void nextAlarm(Context context, int seconds){ Calendar nextAlarm = Calendar.getInstance(); Intent intent = new Intent(context, MyClass.class); PendingIntent pending = PendingIntent.getBroadcast(context, MainActivity.REPEATING_ALARM, intent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager amanager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); nextAlarm.add(Calendar.SECOND, seconds); amanager.set(AlarmManager.RTC_WAKEUP, nextAlarm.getTimeInMillis(), pending); } 

Asegúrese de que el servicio onStartCommand devuelve START_NOT_STICKY, de lo contrario se volverá a intentarlo automáticamente:

 public class UpdateKlasRoostersService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { buildUpdate(); return START_NOT_STICKY; } } 
  • Cómo probar con Espresso un PendingIntent generado por TaskStackBuilder
  • ¿Qué sucede con PendingIntents cuando se quita la aplicación?
  • Iniciar la aplicación sólo si no está en ejecución
  • Adición de diálogo de progreso de android dentro del servicio de fondo con AsyncTask, Obtención de excepción FATAL
  • Objeto AlarmManager después de apagar y en el teléfono
  • Android O, Background Service se está ejecutando durante más de 30 minutos. ¿Por qué?
  • Android: la adición de datos al intento falla al cargar la actividad
  • Android: cómo obtener la ID de PendingIntent para cancelar la función pendingintent
  • Cómo detener una alarma en android
  • Android: ¿cómo abrir una notificación de envío directo que, cuando se cierre, vuelve a la pantalla de inicio?
  • ¿Cómo abrir la aplicación principal de la usable?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.