4

Я кодирую «простой» нотификатор, который заключается в вызове на веб-сайт, проверке ответа и уведомлении, есть ли что-то новое.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 работает нормально, но он никогда не повторяет служебные вызовы.

Любые идеи о том, где проблема?

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

+0

Попробуйте заменить PendingIntent.FLAG_CANCEL_CURRENT с 0 в startschedule и методе cancelschedule. – user755

ответ

6

Я нашел ответ here.

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

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

Надеется, что это помогает кто-то еще :)

+4

Вы избили меня до 15 секунд. Я как раз собирался вам это сказать ;-) –

Смежные вопросы