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 obtener y cancelar una PendingIntent?
  • FusedLocationApi con PendingIntent para actualizaciones de ubicación de fondo. No se pueden recibir actualizaciones
  • Android O, Background Service se está ejecutando durante más de 30 minutos. ¿Por qué?
  • ¿Se pueden usar intentos pendientes con las transmisiones locales?
  • ¿El mensaje de GCM se está reemplazando?
  • GetIntent () en onResume () siempre devuelve la misma acción, ¿cómo consumirla?
  • Cómo detener una alarma en android
  • ¿Cómo enviar una emisión ordenada en un PendingIntent?
  • ¿Cómo puedo pasar correctamente los extras exclusivos a una intención pendiente?
  • ¿Puede un receptor de difusión captar múltiples transmisiones?
  • ¿Por qué noftificaciones aparecen en la barra de notificación de Android por un tiempo, entonces desaparece
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.