2015-04-29 4 views
4

Я пытаюсь перезапустить службу из себя через несколько секунд. Мой код выглядит следующим образом (внутри onStartCommand(...))postDelayed() в службе

Looper.prepare(); 
Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       Intent intent = new Intent(BackgroundService.this, BackgroundService.class); 
       startService(intent); 
      } 
     }, 3 * 60000); 

Сервис работает на переднем плане в то время как этот код выполняется, но это не кажется, называют onStartCommand(...). Есть ли другой способ перезапустить службу из себя через несколько секунд?

UPD: Я узнал, что он фактически перезапускает сервис, но не в определенное время (может занять до 30 минут вместо заданного 3). Итак, теперь вопрос заключается в том, как заставить его перезапускаться

ответ

2

Действия, запланированные обработчиком, не могут выполняться последовательно, потому что устройство может спать в данный момент. Лучший способ планировать любое замедленное действие в фоновом режиме, чтобы использовать систему AlarmManager

В этом случае код должен быть заменен следующим образом:

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

Intent alarmIntent = new Intent(BackgroundService.this, BackgroundService.class); 

PendingIntent pendingIntent = PendingIntent.getService(BackgroundService.this, 1, alarmIntent, 0); 

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 3 * 60, pendingIntent); 
2

Я бы объявить переменную Handler на уровне обслуживания, не локально в onStartCommand, как:

public class NLService extends NotificationListenerService { 
    Handler handler = new Handler(); 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     handler.postDelayed(new Runnable() {....} , 60000); 
    } 

И служба имеет свой собственный цикл, так что вам не нужно Looper.prepare();

1

Заменить

Handler handler = new Handler(); 

С

Handler handler = new Handler(Looper.getMainLooper()); 

работал для меня.

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