7

I'm trying to restart service from itself in a few time. My code looks like this (inside the onStartCommand(...))

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

Service is running in the foreground while this code executes, but it doesn't seem to call onStartCommand(...) . Is there any other way to restart service from itself in a few time?

UPD: I've found out that it actually restarts service, but not in a given time (may take up to 30 minutes instead of given 3). So now the question is how to make it restart consequently

Bolein95
  • 2,947
  • 2
  • 26
  • 31

3 Answers3

6

I would declare the Handler variable at the Service level, not locally in the onStartCommand, like:

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

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

And the service has its own loop, so you do not need Looper.prepare();

geekQ
  • 29,027
  • 11
  • 62
  • 58
4

Replace

Handler handler = new Handler();

With

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

Worked for me.

Matt W
  • 686
  • 1
  • 9
  • 12
3

Actions scheduled by handler can't be run consistently because the device might be sleeping at the moment. The best way to schedule any delayed action in the background is to use system AlarmManager

In this case, code must be replaced with the following:

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);
EspeH
  • 1,308
  • 2
  • 16
  • 34
Bolein95
  • 2,947
  • 2
  • 26
  • 31