I am tracking the current location of user in MainActivity using google api client and update the marker of current location. In the service, I track the current location of user and store it to firebase realtime db.
In MainActivity
, I stop the service using button, by disconnecting the api client as well as stopping the service.
As per similar questions, I have implemented ondestroy in my service. Still after the api client disconnects, service is running and storing the location to firebase.
How do I stop this service ?
Maps Activity :
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
process = (Button)findViewById(R.id.buttonMaps);
stoptrek = (Button) findViewById(R.id.buttonService);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
checkLocationPermission();
}
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
process.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MapsActivity.this,"processing...",Toast.LENGTH_SHORT).show();
Intent i = new Intent(MapsActivity.this,MapsActivity2.class);
MapsActivity.this.startActivity(i);
finishActivity(1);
}
});
stoptrek.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopTrackerService();
stopService(new Intent(MapsActivity.this, TrackingService.class));
Toast.makeText(MapsActivity.this, "GPS tracking disabled", Toast.LENGTH_SHORT).show();
}
});
}
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
buildGoogleApiClient();
mMap.setMyLocationEnabled(true);
startTrackerService();
}
}
else {
buildGoogleApiClient();
mMap.setMyLocationEnabled(true);
startTrackerService();
}
}
public void stopTrackerService()
{
if(mGoogleApiClient.isConnected()){
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, (com.google.android.gms.location.LocationListener) MapsActivity.this);
mGoogleApiClient.disconnect();
Toast.makeText(MapsActivity.this,"Disconnected api client",Toast.LENGTH_SHORT).show();
}
else
Toast.makeText(MapsActivity.this,"api client is already disconnected",Toast.LENGTH_SHORT).show();
}
Service :
public class TrackingService extends Service {
FusedLocationProviderClient client;
private static final String TAG = TrackingService.class.getSimpleName();
public TrackingService() {
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
buildNotification();
loginToFirebase();
}
@Override
public void onDestroy()
{
stopSelf();
}
//Create the persistent notification//
private void buildNotification() {
String stop = "stop";
// Create the persistent notification
Notification.Builder builder = new Notification.Builder(this)
.setContentTitle(getString(R.string.app_name))
.setContentText(getString(R.string.tracking_enabled_notif))
.setOngoing(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
startForeground(1, builder.build());
}
}
private void loginToFirebase() {
String email = "xyz@sdl.com";//getString(R.string.test_email);
String password = "xyz123";//getString(R.string.test_password);
FirebaseAuth.getInstance().signInWithEmailAndPassword(
email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(Task<AuthResult> task) {
if (task.isSuccessful()) {
requestLocationUpdates();
} else {
Log.d(TAG, "Firebase authentication failed");
}
}
});
}
private void requestLocationUpdates() {
LocationRequest request = new LocationRequest();
request.setInterval(5000);
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
client = LocationServices.getFusedLocationProviderClient(this);
final String path = "location";
int permission = ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION);
if (permission == PackageManager.PERMISSION_GRANTED) {
client.requestLocationUpdates(request, new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String uid = user.getUid();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference();
Location location = locationResult.getLastLocation();
if (location != null) {
Toast.makeText(TrackingService.this,"recently add to DB",Toast.LENGTH_SHORT).show();
ref.child(uid).child(path).push().setValue(location);
}
}
}, null);
}
}
I have maps activity where I disconnect from googleapiclient, but even after stopping location updates and service, location is pushed in database.
Please tell me how to stop the service completely. Thanks
This method checks, either the service is running or not. If the service is running then it will return true otherwise false.
Check Running service:
public static boolean isServiceRunning(Context context, Class<?> cls) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
if (activityManager != null) {
for (ActivityManager.RunningServiceInfo runningServiceInfo : activityManager.getRunningServices(Integer.MAX_VALUE)) {
if (cls.getName().equals(runningServiceInfo.service.getClassName())) {
return true;
}
}
}
return false;
}
Stop Running service:
ActivityStackManager.getInstance().stopLocationService(TrackingService.this);
How it works:
if (isServiceRunning(this, TrackingService.class)) {
ActivityStackManager.getInstance().stopLocationService(TrackingService.this);
}
Note: Stop the service too where you want to disconnect Location updates, As I can see you are disconnecting locaiton update at stopTrackerService() method
e-g:
public void stopTrackerService()
{
if (isServiceRunning(this, TrackingService.class)) {
ActivityStackManager.getInstance().stopLocationService(TrackingService.this);
}
if(mGoogleApiClient.isConnected()){
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, (com.google.android.gms.location.LocationListener) MapsActivity.this);
mGoogleApiClient.disconnect();
Toast.makeText(MapsActivity.this,"Disconnected api client",Toast.LENGTH_SHORT).show();
}
else
Toast.makeText(MapsActivity.this,"api client is already disconnected",Toast.LENGTH_SHORT).show();
}
ActivityStackManager
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.util.Log;
public class ActivityStackManager {
private static final ActivityStackManager mActivityStack = new ActivityStackManager();
private ActivityStackManager() {
}
public static ActivityStackManager getInstance() {
return mActivityStack;
}
public void stopLocationService(Context context) {
if (isServiceRunning(context, TrackingService.class)) {
context.stopService(new Intent(context, LocationService.class));
Log.e("StackManager", "TrackingServiceStop");
}
}
public void startLocationService(Context context){
Intent serviceIntent = new Intent(context, TrackingService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(serviceIntent);
} else {
context.startService(serviceIntent);
}
}
}