Как запустить метод onLocationChanged, когда приложение закрыто (с методом onStop)

У меня есть этот метод, который управляет моим местоположением:

 @Override
    public void onLocationChanged(final Location location) {
        if(inRun){
            Clocation myLocation = new Clocation(location, this.useMetricUnits());
            this.updateSpeed(myLocation);
            this.updateDistance(myLocation);
            this.updateAverageSpeed(this.distance, this.chronometer);
            if (activity.getText().toString() != ActivityRecongnizedService.getActivity()) {
                activity.setText(ActivityRecongnizedService.getActivity());
                activityTimer.start();
            }


            switch (activity.getText().toString()) {
                case "STILL": still = true; break;
                case "IN VEHICLE": inVehicle = true; break;
                case "ON BICYCLE": onBicycle = true; break;
                case "ON FOOT": onFoot = true; break;
                case "RUNNING": running = true; break;
                case "WALKING": walking = true;break;
                case "TILTING": tilting = true; break;
            }

            setTimeActivity();

            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
            String[] key;
            key = user.getEmail().split("@");
            reference.child("Position").child(key[0]).child("latlng").setValue(new LatLng(location.getLatitude(),location.getLongitude()));

        }
    }

Но я хочу, чтобы этот метод запускался, когда MainActivity не работает. Я читал об этом, и есть два способа сделать то же самое: с помощью службы или с помощью метода onStop.

Я предпочитаю второй способ, с методом onStop, но я не знаю, как вызвать onLocationChanged в методе onStop.


person Nutiu Radu    schedule 15.06.2019    source источник
comment
что именно вы подразумеваете под onStop ?   -  person lvl4fi4    schedule 15.06.2019
comment
метод, который вызывается, когда активность не работает   -  person Nutiu Radu    schedule 15.06.2019
comment
вы не можете использовать этот метод. вам нужно запустить службу определения местоположения и дождаться, пока она получит долготу (onLocationChanged), поэтому я не думаю, что вы можете просто получить местоположение от OnStop . вам нужно использовать службу, поэтому, когда ваша активность умерла, позвоните в службу определения местоположения, сделайте свое последнее дело и отключите ее тоже.   -  person lvl4fi4    schedule 15.06.2019
comment
Вы хотите отслеживать местоположение, пока ваше приложение находится в фоновом режиме?   -  person dpaksoni    schedule 15.06.2019
comment
@dpaksoni да, и я не знаю как   -  person Nutiu Radu    schedule 15.06.2019


Ответы (2)


Я надеюсь, что это может помочь вам. В Android есть менеджер местоположений, который предоставляет доступ к системному сервису определения местоположения. Вы можете запустить событие onLocationChanged, используя этот класс.

LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

// Get the best provider  for the criteria
Criteria criteria = new Criteria();
criteria.setPowerRequirement(Criteria.POWER_LOW);
criteria.setAccuracy(Criteria.ACCURACY_FINE);

String bestprovider = locationManager.getBestProvider(criteria,false);
locationManager.requestLocationUpdates(bestprovider,0, 0, this);

Если вы вставите часть этого кода в метод onStop, будет запущено событие onLocationChanged.

person Wencheng Li    schedule 15.06.2019

Переопределите свой метод onStop и таким образом получите последнее известное местоположение пользователя.

fusedLocationClient.lastLocation
    .addOnSuccessListener { location : Location? ->
        // Got last known location. In some rare situations this can be null.
    }

перейдите по этой ссылке для получения более подробной информации https://developer.android.com/training/location/retrieve-current теперь, когда вы получили местоположение пользователя при обратном вызове onSuccessListener, вы можете обновить местоположение до своей базы данных/сервера Firebase

Примечание В зависимости от ваших требований вы можете запустить этот код в основном потоке или в другом потоке.

person SSB    schedule 15.06.2019
comment
Я попробую, сэнкс :) - person Nutiu Radu; 15.06.2019