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.

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.

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 🙂

  • Android: ¿Es mejor iniciar y detener un servicio cada vez que sea necesario o dejar que un servicio funcione y se vincule y se desvincule de él?
  • Cliente de servicio WSDL / SOAP de Android
  • Samsung inhabilita paquetes
  • Compartir una biblioteca nativa en dos aplicaciones
  • ¿Cómo iniciar un servicio Android desde una actividad y detener el servicio en otra actividad?
  • ¿Estoy consiguiendo los pasos correctos para verificar la suscripción de Android de un usuario en la aplicación?
  • Dentro de una aplicación, ¿funcionará la actividad y el servicio en el mismo proceso?
  • ¿Por qué no se inicia el servicio después de BOOT_COMPLETED?
  • Android Speech Reconocimiento de voz: Llamada repetida de SpeechRecognizer.startListening () falla en JB 4.1.2
  • Servicio remoto, pérdidas de actividad al girar
  • ¿Cuándo debo usar unbindService (), y cómo debo usarlo correctamente para desvincularme de un servicio remoto que está utilizando una interfaz AIDL?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.