Я кодирую «простой» нотификатор, который заключается в вызове на веб-сайт, проверке ответа и уведомлении, есть ли что-то новое.AlarmManager не повторяется
Я использую службу для выполнения операций http, и я бы хотел, чтобы AlarmManager повторил вызов Службы с заданной частотой. Я проверял учебники, например, this и другие примеры, и, поскольку я хочу, чтобы служба была запланирована либо всякий раз, когда пользователь покидает экран настроек (единственное действие, которое он имеет до сих пор), и после завершения BOOT, поэтому я создал класс для завершите код планирования.
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;
}
}
Вот вызов планировщика от параметров деятельности
//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();
}
вещь: LogCat говорит мне, что служба получает по расписанию (или, лучше сказать, что это не поднять исключение), и он будет выполнен в первый раз. Но после этого, независимо от того, длинный или короткий интервал, он никогда не повторяется. Я пробовал несколько флагов RTC, RTC_WAKEUP, ELAPSED_REALTIME и т. Д., Но я ничего не получил.
Мое устройство для тестирования - это полностью обновленное Nexus 4. Я даже перезагрузил его, поэтому я проверил, что ресивер BOOT_COMPLETE работает нормально, но он никогда не повторяет служебные вызовы.
Любые идеи о том, где проблема?
Заранее спасибо.
Попробуйте заменить PendingIntent.FLAG_CANCEL_CURRENT с 0 в startschedule и методе cancelschedule. – user755