Android Activity не останавливает обновления службы и местоположения - PullRequest
0 голосов
/ 28 сентября 2019

Я отслеживаю текущее местоположение пользователя в MainActivity с помощью клиента API Google и обновляю маркер текущего местоположения.В сервисе я отслеживаю текущее местоположение пользователя и сохраняю его в базе данных Firebase в реальном времени.

В MainActivity я останавливаю сервис с помощью кнопки, отключая клиент API и останавливая сервис.

По аналогичным вопросам я внедрил ondestroy в свой сервис.Тем не менее после того, как клиент API отключается, служба работает и сохраняет местоположение в базе данных.

Как мне остановить эту услугу?

Активность карт:

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

Сервис:

открытый класс TrackingService расширяет сервис {

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

У меня есть активность карт, когда я отключаюсь от googleapiclient, но даже после остановки обновлений местоположения и службы местоположение помещается в базу данных.

Скажите, пожалуйста, как полностью остановить службу.Спасибо

1 Ответ

1 голос
/ 28 сентября 2019

Этот метод проверяет, работает ли служба или нет.Если служба работает, то она вернет true, в противном случае - false.

Проверка работающей службы:

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

Остановить работающую службу:

ActivityStackManager.getInstance().stopLocationService(TrackingService.this);

Как это работает:

if (isServiceRunning(this, TrackingService.class)) {
    ActivityStackManager.getInstance().stopLocationService(TrackingService.this);
}

Примечание: Остановите службу там, где вы хотите отключить обновления местоположения, какЯ вижу, что вы отключаете обновление местоположения с помощью метода stopTrackerService ()

например:

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