#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 на переднем плане здесь.
Другие предлагаемые решения зависят от вашего варианта использования. Еще один интересный пост в блоге о сервисе переднего плана и его альтернативах можно найти здесь.