Best way to get user GPS location in background in Android [duplicate] Best way to get user GPS location in background in Android [duplicate] android android

Best way to get user GPS location in background in Android [duplicate]


None of the rest of the answers use:

com.google.android.gms.location.FusedLocationProviderClient

Which is the Fused Location Provider and the main entry point for interacting with the fused location provider by Google, and it is very hard to find a good example. This was released mid 2017 by Google.

Google Play services location APIs are preferred over the Android framework location APIs (android.location)

If you are currently using the Android framework location APIs, you are strongly encouraged to switch to the Google Play services location APIs as soon as possible.

For you to use the Google Location API, first add this to your build.gradle

compile 'com.google.android.gms:play-services:11.0.0'

Then you can use this class Wherebouts.java:

import android.location.Location;import android.os.Looper;import android.util.Log;import com.google.android.gms.location.FusedLocationProviderClient;import com.google.android.gms.location.LocationCallback;import com.google.android.gms.location.LocationRequest;import com.google.android.gms.location.LocationResult;import com.google.android.gms.location.LocationServices;import com.google.android.gms.location.LocationSettingsRequest;/** * Uses Google Play API for obtaining device locations * Created by alejandro.tkachuk  * alejandro@calculistik.com * www.calculistik.com Mobile Development */public class Wherebouts {    private static final Wherebouts instance = new Wherebouts();    private static final String TAG = Wherebouts.class.getSimpleName();    private FusedLocationProviderClient mFusedLocationClient;    private LocationCallback locationCallback;    private LocationRequest locationRequest;    private LocationSettingsRequest locationSettingsRequest;    private Workable<GPSPoint> workable;    private static final long UPDATE_INTERVAL_IN_MILLISECONDS = 1000;    private static final long FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = 1000;    private Wherebouts() {        this.locationRequest = new LocationRequest();        this.locationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);        this.locationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);        this.locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();        builder.addLocationRequest(this.locationRequest);        this.locationSettingsRequest = builder.build();        this.locationCallback = new LocationCallback() {            @Override            public void onLocationResult(LocationResult locationResult) {                super.onLocationResult(locationResult); // why? this. is. retarded. Android.                Location currentLocation = locationResult.getLastLocation();                GPSPoint gpsPoint = new GPSPoint(currentLocation.getLatitude(), currentLocation.getLongitude());                Log.i(TAG, "Location Callback results: " + gpsPoint);                if (null != workable)                    workable.work(gpsPoint);            }        };        this.mFusedLocationClient = LocationServices.getFusedLocationProviderClient(MainApplication.getAppContext());        this.mFusedLocationClient.requestLocationUpdates(this.locationRequest,                this.locationCallback, Looper.myLooper());    }    public static Wherebouts instance() {        return instance;    }    public void onChange(Workable<GPSPoint> workable) {        this.workable = workable;    }    public LocationSettingsRequest getLocationSettingsRequest() {        return this.locationSettingsRequest;    }    public void stop() {        Log.i(TAG, "stop() Stopping location tracking");        this.mFusedLocationClient.removeLocationUpdates(this.locationCallback);    }}

From your Activity, you can use it like this, by passing a Workable object. A Workable object is nothing more than a custom Callback alike object.

 Wherebouts.instance().onChange(workable);

By using a callback like Workable, you will write UI related code in your Activity and leave the hustle of working with GPS to a helper class, like Wherebouts.

    new Workable<GPSPoint>() {        @Override        public void work(GPSPoint gpsPoint) {            // draw something in the UI with this new data        }    };

Of course you would need to ask for the corresponding permissions to the Android OS for your App to use. You can read the following documentation for more info about that or do some research.


Download the source code from here (Get Current Location Using Background Service)

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="servicetutorial.service">    <uses-permission android:name="android.permission.INTERNET"></uses-permission>    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>    <application        android:allowBackup="true"        android:icon="@mipmap/ic_launcher"        android:label="@string/app_name"        android:supportsRtl="true"        android:theme="@style/AppTheme">        <activity android:name=".MainActivity"            android:theme="@android:style/Theme.Translucent.NoTitleBar">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <service android:name=".GoogleService"></service>    </application></manifest>

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:background="#ffffff"    android:layout_height="match_parent">    <TextView        android:layout_width="match_parent"        android:layout_height="50dp"        android:background="#3F51B5"        android:text="Location using service"        android:textColor="#ffffff"        android:textSize="20dp"        android:gravity="center"/>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_centerInParent="true"        android:orientation="vertical">    <LinearLayout        android:layout_width="match_parent"        android:orientation="horizontal"        android:layout_height="50dp">        <TextView            android:layout_width="150dp"            android:layout_height="wrap_content"            android:text="Latitude"            android:layout_gravity="center_vertical"            android:layout_marginLeft="10dp"            android:textColor="#000000"            android:textSize="20dp"/>        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text=""            android:id="@+id/tv_latitude"            android:layout_gravity="center_vertical"            android:layout_marginLeft="10dp"            android:textColor="#000000"            android:textSize="20dp"/>    </LinearLayout>        <LinearLayout            android:layout_width="match_parent"            android:orientation="horizontal"            android:layout_height="50dp">            <TextView                android:layout_width="150dp"                android:layout_height="wrap_content"                android:text="Longitude"                android:layout_gravity="center_vertical"                android:layout_marginLeft="10dp"                android:textColor="#000000"                android:textSize="20dp"/>            <TextView                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text=""                android:id="@+id/tv_longitude"                android:layout_gravity="center_vertical"                android:layout_marginLeft="10dp"                android:textColor="#000000"                android:textSize="20dp"/>        </LinearLayout>        <LinearLayout            android:layout_width="match_parent"            android:orientation="horizontal"            android:layout_height="50dp">            <TextView                android:layout_width="150dp"                android:layout_height="wrap_content"                android:text="Address"                android:layout_gravity="center_vertical"                android:layout_marginLeft="10dp"                android:textColor="#000000"                android:textSize="20dp"/>            <TextView                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text=""                android:id="@+id/tv_address"                android:layout_gravity="center_vertical"                android:layout_marginLeft="10dp"                android:textColor="#000000"                android:textSize="20dp"/>        </LinearLayout>        <LinearLayout            android:layout_width="match_parent"            android:orientation="horizontal"            android:layout_height="50dp">            <TextView                android:layout_width="150dp"                android:layout_height="wrap_content"                android:text="Area"                android:layout_gravity="center_vertical"                android:layout_marginLeft="10dp"                android:textColor="#000000"                android:textSize="20dp"/>            <TextView                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text=""                android:id="@+id/tv_area"                android:layout_gravity="center_vertical"                android:layout_marginLeft="10dp"                android:textColor="#000000"                android:textSize="20dp"/>        </LinearLayout>        <LinearLayout            android:layout_width="match_parent"            android:orientation="horizontal"            android:layout_height="50dp">            <TextView                android:layout_width="150dp"                android:layout_height="wrap_content"                android:text="Locality"                android:layout_gravity="center_vertical"                android:layout_marginLeft="10dp"                android:textColor="#000000"                android:textSize="20dp"/>            <TextView                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text=""                android:id="@+id/tv_locality"                android:layout_gravity="center_vertical"                android:layout_marginLeft="10dp"                android:textColor="#000000"                android:textSize="20dp"/>        </LinearLayout>    </LinearLayout>    <Button        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:id="@+id/btn_start"        android:text="Get Location"        android:layout_alignParentBottom="true"/></RelativeLayout>

MainActivity.java

package servicetutorial.service;import android.*;import android.app.Activity;import android.app.ActivityManager;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.SharedPreferences;import android.content.pm.PackageManager;import android.location.Address;import android.location.Geocoder;import android.preference.PreferenceManager;import android.renderscript.Double2;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import java.io.IOException;import java.util.List;import java.util.Locale;public class MainActivity extends Activity {    Button btn_start;    private static final int REQUEST_PERMISSIONS = 100;    boolean boolean_permission;    TextView tv_latitude, tv_longitude, tv_address,tv_area,tv_locality;    SharedPreferences mPref;    SharedPreferences.Editor medit;    Double latitude,longitude;    Geocoder geocoder;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btn_start = (Button) findViewById(R.id.btn_start);        tv_address = (TextView) findViewById(R.id.tv_address);        tv_latitude = (TextView) findViewById(R.id.tv_latitude);        tv_longitude = (TextView) findViewById(R.id.tv_longitude);        tv_area = (TextView)findViewById(R.id.tv_area);        tv_locality = (TextView)findViewById(R.id.tv_locality);        geocoder = new Geocoder(this, Locale.getDefault());        mPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());        medit = mPref.edit();        btn_start.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (boolean_permission) {                    if (mPref.getString("service", "").matches("")) {                        medit.putString("service", "service").commit();                        Intent intent = new Intent(getApplicationContext(), GoogleService.class);                        startService(intent);                    } else {                        Toast.makeText(getApplicationContext(), "Service is already running", Toast.LENGTH_SHORT).show();                    }                } else {                    Toast.makeText(getApplicationContext(), "Please enable the gps", Toast.LENGTH_SHORT).show();                }            }        });        fn_permission();    }    private void fn_permission() {        if ((ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)) {            if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION))) {            } else {                ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION                        },                        REQUEST_PERMISSIONS);            }        } else {            boolean_permission = true;        }    }    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        switch (requestCode) {            case REQUEST_PERMISSIONS: {                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                    boolean_permission = true;                } else {                    Toast.makeText(getApplicationContext(), "Please allow the permission", Toast.LENGTH_LONG).show();                }            }        }    }    private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {        @Override        public void onReceive(Context context, Intent intent) {            latitude = Double.valueOf(intent.getStringExtra("latutide"));            longitude = Double.valueOf(intent.getStringExtra("longitude"));            List<Address> addresses = null;            try {                addresses = geocoder.getFromLocation(latitude, longitude, 1);                String cityName = addresses.get(0).getAddressLine(0);                String stateName = addresses.get(0).getAddressLine(1);                String countryName = addresses.get(0).getAddressLine(2);                tv_area.setText(addresses.get(0).getAdminArea());                tv_locality.setText(stateName);                tv_address.setText(countryName);            } catch (IOException e1) {                e1.printStackTrace();            }            tv_latitude.setText(latitude+"");            tv_longitude.setText(longitude+"");            tv_address.getText();        }    };    @Override    protected void onResume() {        super.onResume();        registerReceiver(broadcastReceiver, new IntentFilter(GoogleService.str_receiver));    }    @Override    protected void onPause() {        super.onPause();        unregisterReceiver(broadcastReceiver);    }}

GoogleService.java

package servicetutorial.service;import android.app.Service;import android.content.Context;import android.content.Intent;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.support.annotation.Nullable;import android.util.Log;import java.util.Timer;import java.util.TimerTask;/** * Created by deepshikha on 24/11/16. */public class GoogleService extends Service implements LocationListener{    boolean isGPSEnable = false;    boolean isNetworkEnable = false;    double latitude,longitude;    LocationManager locationManager;    Location location;    private Handler mHandler = new Handler();    private Timer mTimer = null;    long notify_interval = 1000;    public static String str_receiver = "servicetutorial.service.receiver";    Intent intent;    public GoogleService() {    }    @Nullable    @Override    public IBinder onBind(Intent intent) {        return null;    }    @Override    public void onCreate() {        super.onCreate();        mTimer = new Timer();        mTimer.schedule(new TimerTaskToGetLocation(),5,notify_interval);        intent = new Intent(str_receiver);//        fn_getlocation();    }    @Override    public void onLocationChanged(Location location) {    }    @Override    public void onStatusChanged(String provider, int status, Bundle extras) {    }    @Override    public void onProviderEnabled(String provider) {    }    @Override    public void onProviderDisabled(String provider) {    }    private void fn_getlocation(){        locationManager = (LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE);        isGPSEnable = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);        isNetworkEnable = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);        if (!isGPSEnable && !isNetworkEnable){        }else {            if (isNetworkEnable){                location = null;                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1000,0,this);                if (locationManager!=null){                    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);                    if (location!=null){                        Log.e("latitude",location.getLatitude()+"");                        Log.e("longitude",location.getLongitude()+"");                        latitude = location.getLatitude();                        longitude = location.getLongitude();                        fn_update(location);                    }                }            }            if (isGPSEnable){                location = null;                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000,0,this);                if (locationManager!=null){                    location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);                    if (location!=null){                        Log.e("latitude",location.getLatitude()+"");                        Log.e("longitude",location.getLongitude()+"");                        latitude = location.getLatitude();                        longitude = location.getLongitude();                        fn_update(location);                    }                }            }        }    }    private class TimerTaskToGetLocation extends TimerTask{        @Override        public void run() {            mHandler.post(new Runnable() {                @Override                public void run() {                    fn_getlocation();                }            });        }    }    private void fn_update(Location location){        intent.putExtra("latutide",location.getLatitude()+"");        intent.putExtra("longitude",location.getLongitude()+"");        sendBroadcast(intent);    }}

Add this dependency

compile 'com.google.android.gms:play-services:9.4.0'


Grant required permission ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION after start service

import android.annotation.SuppressLint;import android.app.Notification;import android.app.NotificationChannel;import android.app.NotificationManager;import android.app.PendingIntent;import android.app.Service;import android.content.Context;import android.content.Intent;import android.content.IntentSender;import android.location.Location;import android.location.LocationListener;import android.media.RingtoneManager;import android.net.Uri;import android.os.Build;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Looper;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.support.v4.app.NotificationCompat;import android.support.v7.app.AppCompatActivity;import android.util.Log;import com.google.android.gms.common.ConnectionResult;import com.google.android.gms.common.GoogleApiAvailability;import com.google.android.gms.common.api.ApiException;import com.google.android.gms.common.api.GoogleApiClient;import com.google.android.gms.common.api.ResolvableApiException;import com.google.android.gms.location.FusedLocationProviderClient;import com.google.android.gms.location.LocationCallback;import com.google.android.gms.location.LocationRequest;import com.google.android.gms.location.LocationResult;import com.google.android.gms.location.LocationServices;import com.google.android.gms.location.LocationSettingsRequest;import com.google.android.gms.location.LocationSettingsResponse;import com.google.android.gms.location.LocationSettingsStatusCodes;import com.google.android.gms.location.SettingsClient;import com.google.android.gms.tasks.OnCanceledListener;import com.google.android.gms.tasks.OnFailureListener;import com.google.android.gms.tasks.OnSuccessListener;import java.util.concurrent.TimeUnit;/** * Created by Ketan Ramani on 05/11/18. */public class BackgroundLocationUpdateService extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener {    /* Declare in manifest    <service android:name=".BackgroundLocationUpdateService"/>    */    private final String TAG = "BackgroundLocationUpdateService";    private final String TAG_LOCATION = "TAG_LOCATION";    private Context context;    private boolean stopService = false;    /* For Google Fused API */    protected GoogleApiClient mGoogleApiClient;    protected LocationSettingsRequest mLocationSettingsRequest;    private String latitude = "0.0", longitude = "0.0";    private FusedLocationProviderClient mFusedLocationClient;    private SettingsClient mSettingsClient;    private LocationCallback mLocationCallback;    private LocationRequest mLocationRequest;    private Location mCurrentLocation;    /* For Google Fused API */    @Override    public void onCreate() {        super.onCreate();        context = this;    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        StartForeground();        final Handler handler = new Handler();        final Runnable runnable = new Runnable() {            @Override            public void run() {                try {                    if (!stopService) {                        //Perform your task here                    }                } catch (Exception e) {                    e.printStackTrace();                } finally {                    if (!stopService) {                        handler.postDelayed(this, TimeUnit.SECONDS.toMillis(10));                    }                }            }        };        handler.postDelayed(runnable, 2000);        buildGoogleApiClient();        return START_STICKY;    }    @Override    public void onDestroy() {        Log.e(TAG, "Service Stopped");        stopService = true;        if (mFusedLocationClient != null) {            mFusedLocationClient.removeLocationUpdates(mLocationCallback);            Log.e(TAG_LOCATION, "Location Update Callback Removed");        }        super.onDestroy();    }    @Nullable    @Override    public IBinder onBind(Intent intent) {        return null;    }    private void StartForeground() {        Intent intent = new Intent(context, MainActivity.class);        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT);        String CHANNEL_ID = "channel_location";        String CHANNEL_NAME = "channel_location";        NotificationCompat.Builder builder = null;        NotificationManager notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {            NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);            channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);            notificationManager.createNotificationChannel(channel);            builder = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID);            builder.setChannelId(CHANNEL_ID);            builder.setBadgeIconType(NotificationCompat.BADGE_ICON_NONE);        } else {            builder = new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID);        }        builder.setContentTitle("Your title");        builder.setContentText("You are now online");        Uri notificationSound = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_NOTIFICATION);        builder.setSound(notificationSound);        builder.setAutoCancel(true);        builder.setSmallIcon(R.drawable.ic_logo);        builder.setContentIntent(pendingIntent);        Notification notification = builder.build();        startForeground(101, notification);    }    @Override    public void onLocationChanged(Location location) {        Log.e(TAG_LOCATION, "Location Changed Latitude : " + location.getLatitude() + "\tLongitude : " + location.getLongitude());        latitude = String.valueOf(location.getLatitude());        longitude = String.valueOf(location.getLongitude());        if (latitude.equalsIgnoreCase("0.0") && longitude.equalsIgnoreCase("0.0")) {            requestLocationUpdate();        } else {            Log.e(TAG_LOCATION, "Latitude : " + location.getLatitude() + "\tLongitude : " + location.getLongitude());        }    }    @Override    public void onStatusChanged(String provider, int status, Bundle extras) {    }    @Override    public void onProviderEnabled(String provider) {    }    @Override    public void onProviderDisabled(String provider) {    }    @Override    public void onConnected(@Nullable Bundle bundle) {        mLocationRequest = new LocationRequest();        mLocationRequest.setInterval(10 * 1000);        mLocationRequest.setFastestInterval(5 * 1000);        mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();        builder.addLocationRequest(mLocationRequest);        builder.setAlwaysShow(true);        mLocationSettingsRequest = builder.build();        mSettingsClient                .checkLocationSettings(mLocationSettingsRequest)                .addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {                    @Override                    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {                        Log.e(TAG_LOCATION, "GPS Success");                        requestLocationUpdate();                    }                }).addOnFailureListener(new OnFailureListener() {            @Override            public void onFailure(@NonNull Exception e) {                int statusCode = ((ApiException) e).getStatusCode();                switch (statusCode) {                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:                        try {                            int REQUEST_CHECK_SETTINGS = 214;                            ResolvableApiException rae = (ResolvableApiException) e;                            rae.startResolutionForResult((AppCompatActivity) context, REQUEST_CHECK_SETTINGS);                        } catch (IntentSender.SendIntentException sie) {                            Log.e(TAG_LOCATION, "Unable to execute request.");                        }                        break;                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:                        Log.e(TAG_LOCATION, "Location settings are inadequate, and cannot be fixed here. Fix in Settings.");                }            }        }).addOnCanceledListener(new OnCanceledListener() {            @Override            public void onCanceled() {                Log.e(TAG_LOCATION, "checkLocationSettings -> onCanceled");            }        });    }    @Override    public void onConnectionSuspended(int i) {        connectGoogleClient();    }    @Override    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {        buildGoogleApiClient();    }    protected synchronized void buildGoogleApiClient() {        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(context);        mSettingsClient = LocationServices.getSettingsClient(context);        mGoogleApiClient = new GoogleApiClient.Builder(context)                .addConnectionCallbacks(this)                .addOnConnectionFailedListener(this)                .addApi(LocationServices.API)                .build();        connectGoogleClient();        mLocationCallback = new LocationCallback() {            @Override            public void onLocationResult(LocationResult locationResult) {                super.onLocationResult(locationResult);                Log.e(TAG_LOCATION, "Location Received");                mCurrentLocation = locationResult.getLastLocation();                onLocationChanged(mCurrentLocation);            }        };    }    private void connectGoogleClient() {        GoogleApiAvailability googleAPI = GoogleApiAvailability.getInstance();        int resultCode = googleAPI.isGooglePlayServicesAvailable(context);        if (resultCode == ConnectionResult.SUCCESS) {            mGoogleApiClient.connect();        }    }    @SuppressLint("MissingPermission")    private void requestLocationUpdate() {        mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());    }}

In Activity

Start Service : startService(new Intent(this, BackgroundLocationUpdateService.class));

Stop Service : stopService(new Intent(this, BackgroundLocationUpdateService.class));

In Fragment

Start Service : getActivity().startService(new Intent(getActivity().getBaseContext(), BackgroundLocationUpdateService.class));

Stop Service : getActivity().stopService(new Intent(getActivity(), BackgroundLocationUpdateService.class));