0

For location updated I have used Fused Location API, but it seems that some Android phones are killing the foreground service after a while. How I can run foreground services and be sure that they won't be terminated by Android?

public class LocationUpdatesService extends Service {

 public class LocalBinder extends Binder {
    public LocationUpdatesService getService() {
        return LocationUpdatesService.this;
    }
}

private final IBinder mBinder = new LocalBinder();

@Override
public void onCreate() {
    createFusedLocationClient();
    createFusedLocationRequest();
    createLocationCallback();

    startForeground(NOTIFICATION_ID, createNotification());
}

private void createFusedLocationClient() {
    locationClient = LocationServices.getFusedLocationProviderClient(getApplicationContext());

}

private void createFusedLocationRequest() {
    locationRequest = new LocationRequest();
    locationRequest.setMaxWaitTime(MAXIMUM_WAIT_TIME);
    locationRequest.setSmallestDisplacement(MAXIMUM_DISPLACEMENT);
    locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    String action = intent.getAction();

    if (action != null && action.equalsIgnoreCase(Constants.REQUEST_LOCATION_UPDATES)) {
        requestLocationUpdates();
    }
    if (action != null && action.equalsIgnoreCase(Constants.REMOVE_LOCATION_UPDATES)) {
        removeLocationUpdates();
        stopSelf();
    }
   
    return START_REDELIVER_INTENT;
}

@Override
public IBinder onBind(Intent intent) {
    ContextCompat.startForegroundService(getApplicationContext(), new Intent(getApplicationContext(),
            LocationUpdatesService.class));
    return mBinder;
}

}
Pesa
  • 241
  • 1
  • 3
  • 8

1 Answers1

0

You can restart the service in the function onTaskRemoved

override fun onTaskRemoved(rootIntent: Intent) {
    val restartServiceIntent = Intent(applicationContext, LocationUpdatesService::class.java).also {
        it.setPackage(packageName)
    };
    val restartServicePendingIntent: PendingIntent = PendingIntent.getService(this, 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
    applicationContext.getSystemService(Context.ALARM_SERVICE);
    val alarmService: AlarmManager = applicationContext.getSystemService(Context.ALARM_SERVICE) as AlarmManager;
    alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() + 1000, restartServicePendingIntent);
}

If somebody has the same issue, this article helped me a lot, it describes how to create a foreground service

https://robertohuertas.com/2019/06/29/android_foreground_services/

Pesa
  • 241
  • 1
  • 3
  • 8