I have this background service, which runs continuously even when the application closed (Paused or Stopped).The service is to retrieve the user location and post it to server. Here's my code.public class LocationUpdaterService extends Service{    public static final int TWO_MINUTES = 120000; // 120 seconds    public static Boolean isRunning = false;    public LocationManager mLocationManager;    public LocationUpdaterListener mLocationListener;    public Location previousBestLocation = null;    @Nullable    @Override    public IBinder onBind(Intent intent) {        return null;    }    @Override    public void onCreate() {        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);        mLocationListener = new LocationUpdaterListener();        super.onCreate();    }    Handler mHandler = new Handler();    Runnable mHandlerTask = new Runnable(){        @Override        public void run() {            if (!isRunning) {                startListening();            }            mHandler.postDelayed(mHandlerTask, TWO_MINUTES);        }    };    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        mHandlerTask.run();        return START_STICKY;    }    @Override    public void onDestroy() {        stopListening();        mHandler.removeCallbacks(mHandlerTask);        super.onDestroy();    }    private void startListening() {        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED                || ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {            if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER))                mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListener);            if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER))                mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);        }        isRunning = true;    }    private void stopListening() {        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED                || ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {            mLocationManager.removeUpdates(mLocationListener);        }        isRunning = false;    }    public class LocationUpdaterListener implements LocationListener    {        @Override        public void onLocationChanged(Location location) {            if (isBetterLocation(location, previousBestLocation)) {                previousBestLocation = location;                try {                    // Script to post location data to server..                }                catch (Exception e) {                    e.printStackTrace();                }                finally {                    stopListening();                }            }        }        @Override        public void onProviderDisabled(String provider) {            stopListening();        }        @Override        public void onProviderEnabled(String provider) { }        @Override        public void onStatusChanged(String provider, int status, Bundle extras) { }    }    protected boolean isBetterLocation(Location location, Location currentBestLocation) {        if (currentBestLocation == null) {            // A new location is always better than no location            return true;        }        // Check whether the new location fix is newer or older        long timeDelta = location.getTime() - currentBestLocation.getTime();        boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;        boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;        boolean isNewer = timeDelta > 0;        // If it's been more than two minutes since the current location, use the new location        // because the user has likely moved        if (isSignificantlyNewer) {            return true;            // If the new location is more than two minutes older, it must be worse        } else if (isSignificantlyOlder) {            return false;        }        // Check whether the new location fix is more or less accurate        int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());        boolean isLessAccurate = accuracyDelta > 0;        boolean isMoreAccurate = accuracyDelta < 0;        boolean isSignificantlyLessAccurate = accuracyDelta > 200;        // Check if the old and new location are from the same provider        boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider());        // Determine location quality using a combination of timeliness and accuracy        if (isMoreAccurate) {            return true;        } else if (isNewer && !isLessAccurate) {            return true;        } else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {            return true;        }        return false;    }    /** Checks whether two providers are the same */    private boolean isSameProvider(String provider1, String provider2) {        if (provider1 == null) {            return provider2 == null;        }        return provider1.equals(provider2);    }}So, I figured to use a Handler to listen to LocationListener once every 2 minutes because I am assuming this is saving more battery usage.But, I don't know if there's still any way I can improve my code so that;It's saving much battery power.Memory friendly.The code is easier to read and maintain.Any suggestion is appreciated. Thank you.
Android Studio Background Service to Update Location
java;android