Лучший способ получить местоположение GPS в фоновом режиме для Android API уровня 30 и выше
Nov 30 2020
Мое приложение определяет ограничение скорости по местоположению пользователя и сообщает пользователю, если он его превысил. Начиная с Android API уровня 30 и выше, Google определяет IntentService как устаревший и предлагает использовать WorkManager или JobIntentService, а также заявляет, что необходимо перейти с Firebase JobDispatcher на WorkManager. Я вижу два пути решения этой проблемы:
- Запустите OneTimeWorkRequest и укажите периодический перезапуск этого метода в этом методе, пока приложение работает в фоновом режиме.
- Запустите 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как другой контейнер выполнения для вашего варианта использования.