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
- Buscando explicación de los laicos sobre el concepto de intención pendiente
- Enumeración usb Android
- Intento pendiente de obtener servicio
- ¿Cuándo usar IntentSender vs. PendingIntent?
- ¿Cómo utilizar PendingIntent para comunicarse desde un servicio a un cliente / actividad?
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.
- Android: Inicie el servicio con Context.startService vs PendingIntent.getService
- Android Geofencing - No intentos próximos?
- ¿Cómo abrir la aplicación principal de la usable?
- Cómo recibir notificaciones cuando se notifica una notificación
- Creación de una notificación en un momento determinado mediante el Administrador de alarmas
- Programar más de una actividad pendiente en la misma actividad con AlarmManager
- OnActivityResult para PendingIntent
- Android: PendingIntent de la notificación no activa el onCreate () si se vuelve a activar la actividad en la pantalla
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; } }
- Puede alguien decir cuál es el uso de la actividad de inicio para el resultado en android
- Superposición transparente GLSurfaceview en la vista existente en android?