TL; DR:
Добавьте android:foregroundServiceType="location"
к вашей Service's
заявленной декларации.
ОБЪЯСНЕНИЕ
Это новое поведение для Android 10 точно такое же, как вы описали: несмотря на то, что вы можете использовать службу переднего плана, через 30 секунд после того, как ваше приложение покидает экран - обновления местоположения прекращаются.
Возможно, вызаметил, что устройства Android 10 предоставляют пользователю два новых выбора при предоставлении разрешений на местоположение (для устаревших приложений (API <29) или приложений, которые объявляют разрешение <code>ACCESS_BACKGROUND_LOCATION):
- "Разрешить всеtime "
- " Разрешить только во время использования этого приложения "
" Разрешить только во время использования этого приложения "фактически означает" Разрешить, пока приложение видно на экране ». Это потому, что у пользователя теперь есть возможность выборочного удаления доступа к местоположению - даже к приоритетному сервису - на основе этих критериев. Пользователи могут изменить этот параметр в любое время , даже если ваше приложение работает.
Документы Android объясняют, что решение android:foregroundServiceType="location"
предназначено для вашеготочный вариант использования: приложения, подобные "Google Maps", которые имеют службу переднего плана, но, как ожидается, продолжат обработку данных о местоположении, если пользователь переключится на другое приложение. Этот метод называется «продолжение действия, инициированного пользователем», и он позволяет получать обновления местоположения даже после помещения приложения в «фон».
(Документы, похоже, расширяют определениетермин «фон», здесь. В прошлом, если у вас была служба переднего плана, ваше приложение рассматривалось «на переднем плане» - по крайней мере, для целей приоритета задач, Doze и т. д. Теперь кажется, что приложениесчитается "в фоновом режиме", что касается доступа к местоположению, если он не был на экране в течение последних 30 секунд.)
Я не уверен, что изменения пользовательского интерфейса (как в магазине Google Play) принимаютместо, когда вы установите конкретный foregroundServiceType
. Несмотря на это, мне кажется, что пользователи вряд ли будут возражать.
ДРУГИЕ РЕШЕНИЯ ДЛЯ УСТРОЙСТВ ANDROID 10
В качестве альтернативы, вы могли бы объявить targetSdkVersion
из 28или меньше, что позволит вашему приложению функционировать в «режиме совместимости».
У вас также есть возможность получить разрешение ACCESS_BACKGROUND_LOCATION
, но docs предостережение против этого:
Если ваше приложение не требует доступа к местоположению при работе в фоновом режиме, настоятельно рекомендуется не запрашивать ACCESS_BACKGROUND_LOCATION
...
Этот подход нетребуется, для вашего случая использования, потому что ваш Activity
используется для запуска вашего Service
;Вы можете быть уверены, что ваше приложение было на экране хотя бы один раз, прежде чем Service
начнет получать фоновые обновления местоположения. (По крайней мере, я предполагаю , что именно так ОС определяет начало «действия, инициированного пользователем». Предположительно, подход foregroundServiceType
не будет работать, если вы запускаете Service
от JobScheduler
, или BroadcastReceiver
, или чего-то еще.)
PS: Держитесь за этот код WakeLock
. Вам нужно будет держать устройство в активном состоянии, если вы хотите получать обновления с постоянной скоростью 10 секунд.