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
- ¿Cómo enviar una emisión ordenada en un PendingIntent?
- Cómo utilizar FLAG_ACTIVITY_SINGLE_TOP y varias tareas con PendingIntents
- ¿Cuál es el concepto de intención pendiente? ¿Por qué y cuándo utilizamos intención pendiente?
- ¿Cómo utilizar PendingIntent para comunicarse desde un servicio a un cliente / actividad?
- API de ubicación de Google: solicita actualizaciones de ubicación con intención pendiente?
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.
- ¿Es necesario usar FLAG_ACTIVITY_NEW_TASK en la opción PendingIntent de una notificación?
- Android: Crear una sola tarea con actividades de varias aplicaciones (problema Lauchmode)
- Android Geofencing - No intentos próximos?
- TaskStack personalizado termina la actividad principal de la notificación
- Cómo guardar persistentemente PendingIntent proporcionado por otra aplicación
- Intento pendiente con el indicador ONE_SHOT
- ¿Cómo crear different pendingintent para que filterEquals () devuelva false?
- Android: ¿Cómo puedo acceder a un AsyncTask desde un PendingIntent creado por una notificación de barra de estado?
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?