AlarmManager не повторяется

Я кодирую "простой" уведомитель, который состоит из вызова на веб-сайт, проверки ответа и уведомления, если есть что-то новое.

Я использую Сервис для выполнения операций http и хотел бы, чтобы AlarmManager повторил вызов Сервису с заданной частотой. Я проверял учебные пособия, подобные этому и другим примерам, и, поскольку я хочу, чтобы служба планировалась либо всякий раз, когда пользователь покидает экран настроек (единственное действие, которое у него было до сих пор), а также после завершения загрузки, поэтому я создал класс для оберните код планирования.

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;
}

}

Вот звонок в планировщик из настроек Activity

//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 работает нормально, но он никогда не повторяет сервисные вызовы.

Есть идеи, где проблема?

Заранее спасибо.

1 ответ

Решение

Я нашел ответ здесь.

Видимо, когда вы хотите запланировать СЕРВИС, вы не используете PendingIntent.getBroadcast но PendingIntent.getService,

Просто это небольшое изменение, и оно повторяется, как и должно.

Надеюсь, это поможет кому-то еще:)

Другие вопросы по тегам