AlarmManager no se repite
Estoy codificando un notificador "simple" que consiste en llamar a un sitio web, comprobar la respuesta y notificar si hay algo nuevo.
Estoy usando un servicio para hacer las operaciones http y me gustaría que AlarmManager repita la llamada al servicio con una frecuencia dada. He estado revisando tutoriales como éste y otros ejemplos y, ya que quiero que el servicio se programe cada vez que el usuario abandona la pantalla de configuración (la única actividad que ha realizado hasta ahora) y después de completar BOOT, así que creé una clase para Envuelva el código de programación.
- En la aplicación de facturación V3 Service nullpointer Android
- ¿Cuáles son las ventajas y desventajas de ejecutar un servicio en un proceso diferente?
- Thread, Asynctask o intentService para mi aplicación?
- SMS Broadcast Receiver no funciona después de reiniciar
- Iniciar un servicio en un proceso separado android
public class Scheduler { public static boolean cancelScheduledService(Context ctx, Intent serviceIntent) { boolean success = true; Log.v("novUmbria", "Scheduler.cancelScheduledService"); try { AlarmManager am = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE); am.cancel( PendingIntent.getBroadcast( ctx, 0, new Intent(ctx, NotificadorService.class), // si ya existe, no genera un 2º PendingIntent.FLAG_CANCEL_CURRENT ) ); Log.v("novUmbria", "Scheduler.cancelScheduledService Servicio cancelado"); } catch (Exception e) { Log.e("novUmbria", "Scheduler.cancelScheduledService Excepción: " + e.getMessage()); success = false; } return success; } public static boolean scheduleService(Context ctx, Intent serviceIntent, long interval) { boolean success = true; Log.v("novUmbria", "Scheduler.scheduleService Servicio "); try { Calendar cal = Calendar.getInstance(); SimpleDateFormat timeformat = new SimpleDateFormat("HH:mm"); // timeformat.setTimeZone(TimeZone.getTimeZone("Europe/Madrid")); AlarmManager am = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE); am.setRepeating( // am.setInexactRepeating( // AlarmManager.ELAPSED_REALTIME_WAKEUP, AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), interval, PendingIntent.getBroadcast( ctx, 0, new Intent(ctx, NotificadorService.class), // si ya existe, no genera un 2º PendingIntent.FLAG_CANCEL_CURRENT ) ); Log.v("novUmbria", "Scheduler.scheduleService Servicio programado a las " + timeformat.format(cal.getTime()) + " cada " + (interval / 60000) + " minutos" ); startService(ctx, serviceIntent); Log.v("novUmbria", "Scheduler.scheduleService Servicio iniciado" ); } catch (Exception e) { Log.e("novUmbria", "Scheduler.scheduleService Excepción: " + e.getMessage()); success = false; } return success; } public static boolean startService(Context ctx, Intent serviceIntent) { boolean success = true; Log.v("novUmbria", "Scheduler.startService"); try { ctx.startService(serviceIntent); Log.v("novUmbria", "Scheduler.startService Servicio iniciado"); } catch (Exception e) { Log.e("novUmbria", "Scheduler.startService Excepción: " + e.getMessage()); success = false; } return success; }
}
Esta es la llamada al programador de la configuración Actividad
//Settings Activity @Override protected void onStop() { Log.v("novUmbria", "SettingsActivity.onStop"); Intent serviceIntent = new Intent(getApplicationContext(), NotificadorService.class); Scheduler.cancelScheduledService(getApplicationContext(), serviceIntent); long frequency = 1000 * 60 / 2; Scheduler.scheduleService(getApplicationContext(), serviceIntent, frequency ); Log.v("novUmbria", "SettingsActivity.onStop scheduleService"); super.onStop(); }
La cosa es: logcat me dice que el servicio se programa (o, mejor dicho, que no plantea una excepción) y se ejecuta por primera vez. Pero, después de eso, no importa cuán largo o corto sea el intervalo, nunca se repite. He probado varias banderas RTC, RTC_WAKEUP, ELAPSED_REALTIME etc, pero no tengo nada.
Mi dispositivo de prueba es un Nexus 4 completamente actualizado. Incluso he reiniciado, así que he comprobado el receptor BOOT_COMPLETE funcionó bien, pero nunca se repite las llamadas de servicio.
¿Alguna idea de dónde está el problema?
Gracias por adelantado.
- Mataron el servicio de Android y las variables estáticas
- Detenga el servicio de Android cuando la aplicación se cierra con el administrador de tareas
- ¿Hay de todos modos para crear un servicio de proceso en segundo plano que se ejecutará o no la aplicación creada todavía se está ejecutando?
- Servicio de Android para sockets TCP
- ¿Por qué no funciona mi servicio en Android? (Sólo quiero registrar algo nunca 5 segundos)
- Desactivar ocultar una presentación (pantalla secundaria)
- ¿Cómo inicio un servicio desde mi Interactor usando el patrón MVP en android?
- Cómo mantener un servicio de Intent funcionando
He encontrado la respuesta aquí .
Al parecer, cuando desea programar un servicio, no utiliza PendingIntent.getBroadcast
pero PendingIntent.getService
.
Sólo ese pequeño cambio y está repitiendo como debería.
Espero que esto ayude a alguien más 🙂
- El tipo nuevo AdapterView.OnItemSelectedListener () {} debe implementar el error del método abstracto heredado. Eclipse
- Android SDk Manager – Descargar SDK 3.0 a 3.2