Получить скорость в фоновом режиме

#java #android

Вопрос:

Эй, я пытаюсь увеличить скорость работы моего приложения, когда оно работает в фоновом режиме. Я использую getSpeed (), и он работает, когда мое приложение работает на переднем плане. Я пытался воспользоваться сервисом для этого, но он дает мне скорость только через несколько минут, и мне это нужно чаще. Я читал, что Google изменил свои условия, но я не уверен, что с этим можно что-то сделать (возможно, какое-то разрешение или оставить приложение запущенным как плавающее).

Вот мой код:

 public class LocationService extends Service {

    private static final String TAG = "LocationService";

    private LocationManager locationManager;
    private LocationListener locationListener;
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 1;
    private static final long MIN_TIME_BW_UPDATES = 1000 * 1;

    @Override
    public void onCreate() {
        super.onCreate();
        locationManager = (LocationManager) getSystemService
                (Context.LOCATION_SERVICE);
        locationListener = new SpeedActionListener();
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED amp;amp; ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        }
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, locationListener);
        Log.d(TAG, "onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand");
        super.onStartCommand(intent, flags, startId);
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind");
        return null;
    }

    private class SpeedActionListener implements android.location.LocationListener {
        private static final String TAG = "SpeedoActionListener";

        @Override
        public void onLocationChanged(Location location) {
            if(location != null) {
                if(location.hasSpeed()){
                    double mySpeed = location.getSpeed();
                    Log.d(TAG, "Current speed: "   String.valueOf(mySpeed * 3.6));
                }
            }
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }
    }
}
 

Спасибо вам всем!

Комментарии:

1. Вы должны взять добычу на AsyncTask : developer.android.com/reference/android/os/AsyncTask

Ответ №1:

Ваше наблюдаемое поведение является правильным. Когда ваше приложение работает в фоновом режиме, оно получает обновления местоположения всего несколько раз в час.

Вы можете найти более подробную информацию здесь: Ограничения на фоновое местоположение

На странице также упоминаются некоторые возможные решения:

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

  • Выведите свое приложение на передний план. Запустите службу переднего плана в своем приложении, вызвав startForegroundService(). Когда такая служба переднего плана активна, она отображается как текущее уведомление в области уведомлений.
  • Используйте элементы API геозоны, такие как интерфейс GeofencingApi, которые оптимизированы для минимизации энергопотребления.
  • Используйте пассивный прослушиватель местоположения, который может получать более быстрые обновления местоположения, если есть приложения переднего плана, запрашивающие обновления местоположения с более высокой скоростью.

Самым простым решением может быть продвижение вашей службы на передний план, но для этого требуется, чтобы уведомление было видно в течение всего времени выполнения в центре уведомлений телефона. Вы можете прочитать о сервисе Android на переднем плане здесь.

Другие предлагаемые решения зависят от вашего варианта использования. Еще один интересный пост в блоге о сервисе переднего плана и его альтернативах можно найти здесь.