Лучший способ получить местоположение GPS в фоновом режиме для Android API уровня 30 и выше

Nov 30 2020

Мое приложение определяет ограничение скорости по местоположению пользователя и сообщает пользователю, если он его превысил. Начиная с Android API уровня 30 и выше, Google определяет IntentService как устаревший и предлагает использовать WorkManager или JobIntentService, а также заявляет, что необходимо перейти с Firebase JobDispatcher на WorkManager. Я вижу два пути решения этой проблемы:

  1. Запустите OneTimeWorkRequest и укажите периодический перезапуск этого метода в этом методе, пока приложение работает в фоновом режиме.
  2. Запустите PeriodicWorkRequest с минимально допустимым интервалом 15 минут. В этом методе запустите метод JobIntentService, который работает примерно до 10 минут , но метод может не работать или может быть уничтожен системой до его завершения.

Я волнуюсь о:

  • потенциальные утечки памяти;
  • потенциальные проблемы с WorkManager или JobIntentService при переходе с переднего плана на задний план и наоборот
  • возможность использовать паттерн MVVM

Ответы

5 NikolaDespotoski Dec 07 2020 at 23:42

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

Что касается ваших опасений:

  • Единственная возможная утечка - это неправильное выполнение обратных вызовов местоположения. Это легко отследить, особо не беспокойтесь об этом.
  • Запланированные Workerпомещаются в базу данных и выполняются независимо от приложения. Это означает, что пользовательская видимость приложения не имеет никакого значения. В вашем случае, я полагаю , вы хотите , чтобы отменить запланированную работу , как только пользователь возобновляет заявление, что сказанное можно назначить tagна Workerи очистить любой плановый или на постоянной основе , как только виден пользователю.
  • Я предпочитаю Workerизолировать s от MVVM и просто внедрять варианты использования / интеракторы в worker и выполнять вариант использования / запрашивать интерактор. WorkerManagerпредлагает прекрасные API-интерфейсы для запроса Workerстатуса, вам может потребоваться написать общий язык между вашей предыдущей реализацией и API> = 30. Рассматривайте этот Workerкак другой контейнер выполнения для вашего варианта использования.