Приложения, которые нацелены на Android 12 (API -уровень 31) или выше, не могут запустить службы переднего плана, пока приложение работает в фоновом режиме, за исключением нескольких особых случаев . Если приложение пытается запустить службу переднего плана, в то время как приложение работает на заднем плане, а служба переднего плана не удовлетворяет одному из исключительных случаев, система бросает ForegroundServiceStartNotAllowedException
.
Кроме того, если приложение хочет запустить службу переднего плана, требующую разрешений во время использования (например, разрешение на использование датчика тела, камеры, микрофона или определение местоположения), оно не сможет создать эту службу, пока приложение находится в фоновом режиме, даже если приложение подпадает под одно из исключений из ограничений на запуск в фоновом режиме. Причина этого объясняется в разделе «Ограничения на запуск служб переднего плана, требующих разрешений во время использования» .
Освобождение от ограничений на фоновый запуск
В следующих ситуациях ваше приложение может запускать службы переднего плана, даже если оно работает в фоновом режиме:
- Ваше приложение переходит из видимого пользователю состояния, например, активности .
- Ваше приложение может начать действие из фонового режима , за исключением случая, когда приложение имеет действие в стеке текущих задач.
Ваше приложение получает высокоприоритетное сообщение с помощью Firebase Cloud Messaging .
Пользователь выполняет действие с элементом пользовательского интерфейса, связанным с вашим приложением. Например, он может взаимодействовать с всплывающей подсказкой , уведомлением , виджетом или действием.
Ваше приложение вызывает точный сигнал тревоги для завершения действия, запрошенного пользователем.
Ваше приложение — это текущий метод ввода устройства.
Ваше приложение получает событие, связанное с геозонированием или переходом в режим распознавания активности .
После того, как устройство перезагружается и получает
ACTION_BOOT_COMPLETED
,ACTION_LOCKED_BOOT_COMPLETED
илиACTION_MY_PACKAGE_REPLACED
at atert в трансляции .Ваше приложение получает действие намерения
ACTION_TIMEZONE_CHANGED
,ACTION_TIME_CHANGED
илиACTION_LOCALE_CHANGED
в приемнике вещания.Ваше приложение получает событие
ACTION_TRANSACTION_DETECTED
отNfcService
.Приложения с определенными системными ролями или разрешениями, такими как владельцы устройств и владельцы профилей .
Ваше приложение использует Companion Device Manager и объявляет разрешение
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
илиREQUEST_COMPANION_RUN_IN_BACKGROUND
. По возможности используйтеREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
.Пользователь отключает оптимизацию расхода заряда батареи для вашего приложения.
Ваше приложение имеет разрешение
SYSTEM_ALERT_WINDOW
. Примечание: если ваше приложение предназначено для Android 15 или более поздних версий, оно должно иметь разрешениеSYSTEM_ALERT_WINDOW
, а приложение должно иметь видимое окно наложения.
Ограничения на запуск приоритетных служб, требующих разрешений на время использования
В Android 14 (уровень API 34) и выше существуют особые ситуации, о которых следует знать, если вы запускаете службу переднего плана, которой требуются разрешения на время использования.
Если ваше приложение предназначено для Android 14 или более поздней версии, операционная система проверяет при создании службы переднего плана наличие у приложения всех необходимых разрешений для этого типа службы. Например, при создании службы переднего плана типа «микрофон » операционная система проверяет, есть ли у вашего приложения разрешение RECORD_AUDIO
. Если этого разрешения нет, система выдаёт исключение SecurityException
.
Для разрешений «во время использования» это может привести к потенциальной проблеме. Если у вашего приложения есть разрешение «во время использования», оно действует только пока приложение находится в фоновом режиме . Это означает, что если ваше приложение работает в фоновом режиме и пытается создать службу переднего плана типа «камера», «локация» или «микрофон», система обнаруживает, что у вашего приложения в данный момент нет необходимых разрешений, и выдаёт исключение SecurityException
.
Аналогично, если ваше приложение работает в фоновом режиме и создаёт службу контроля работоспособности, которой требуется разрешение BODY_SENSORS
, у приложения в данный момент такого разрешения нет, и система выдаёт исключение. (Это не относится к службе контроля работоспособности, которой требуются другие разрешения, например ACTIVITY_RECOGNITION
.) Вызов метода PermissionChecker.checkSelfPermission()
не решает эту проблему. Если у вашего приложения есть разрешение на использование во время использования, и оно вызывает метод checkSelfPermission()
для проверки наличия этого разрешения, метод возвращает PERMISSION_GRANTED
даже если приложение работает в фоновом режиме. Когда метод возвращает PERMISSION_GRANTED
, он говорит: «У вашего приложения есть это разрешение , пока приложение используется ».
По этой причине, если вашей службе переднего плана требуется разрешение на использование во время использования, вы должны вызвать Context.startForegroundService()
или Context.bindService()
пока ваше приложение имеет видимую активность, если только служба не подпадает под одно из определенных исключений .
Освобождение от ограничений на разрешения во время использования
В некоторых ситуациях, даже если служба переднего плана запускается, пока приложение работает в фоновом режиме , она все равно может получать доступ к информации о местоположении, камере и микрофоне, пока приложение работает в фоновом режиме («во время использования»).
В этих же ситуациях, если служба объявляет тип location
переднего плана и запускается приложением, имеющим разрешение ACCESS_BACKGROUND_LOCATION
, эта служба может получать доступ к информации о местоположении в любое время, даже если приложение работает в фоновом режиме.
Следующий список содержит эти ситуации:
- Системный компонент запускает службу.
- Сервис начинается с взаимодействия с виджетами приложения .
- Сервис начинается с взаимодействия с уведомлением.
- Служба запускается как
PendingIntent
, отправляемый из другого видимого приложения. - Служба запускается приложением, представляющим собой контроллер политики устройства , работающий в режиме владельца устройства.
- Служба запускается с помощью приложения, которое предоставляет
VoiceInteractionService
. - Служба запускается приложением, имеющим привилегированное разрешение
START_ACTIVITIES_FROM_BACKGROUND
.
Определите, какие службы в вашем приложении затронуты
При тестировании вашего приложения начните его службы переднего плана. Если запуск служба имеет ограниченный доступ к местоположению, микрофону и камере, в LogCat появляется следующее сообщение:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME