Приложения, предназначенные для Android 12 (уровень API 31) или выше, не могут запускать службы переднего плана, пока приложение работает в фоновом режиме, за исключением нескольких особых случаев . Если приложение пытается запустить службу переднего плана, пока приложение работает в фоновом режиме, и служба переднего плана не удовлетворяет одному из исключительных случаев, система выдает исключение ForegroundServiceStartNotAllowedException
.
Кроме того, если приложение хочет запустить службу переднего плана, которой требуются разрешения во время использования (например, датчик тела, камера, микрофон или разрешения на местоположение), оно не может создать службу, пока приложение находится в фоновом режиме, даже если приложение попадает под одно из исключений из ограничений на запуск в фоновом режиме. Причина этого объясняется в разделе Ограничения на запуск служб переднего плана, которым требуются разрешения во время использования .
Освобождение от ограничений на фоновое начало
В следующих ситуациях ваше приложение может запускать службы переднего плана, даже если оно работает в фоновом режиме:
- Ваше приложение переходит из видимого пользователю состояния, например, из активности .
- Ваше приложение может запустить действие из фонового режима , за исключением случая, когда приложение имеет действие в стеке задач назад существующей задачи.
Ваше приложение получает высокоприоритетное сообщение с помощью Firebase Cloud Messaging .
Пользователь выполняет действие над элементом пользовательского интерфейса, связанным с вашим приложением. Например, он может взаимодействовать с пузырем , уведомлением , виджетом или действием.
Ваше приложение вызывает точный сигнал тревоги для выполнения действия, запрошенного пользователем.
Ваше приложение — это текущий метод ввода на устройстве.
Ваше приложение получает событие, связанное с геозонированием или переходом в режим распознавания активности .
После перезагрузки устройства и получения действия намерения
ACTION_BOOT_COMPLETED
,ACTION_LOCKED_BOOT_COMPLETED
илиACTION_MY_PACKAGE_REPLACED
в широковещательном приемнике .Ваше приложение получает действие намерения
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
.
Для разрешений while-in-use это может привести к потенциальной проблеме. Если у вашего приложения есть разрешение while-in-use, оно будет иметь его только пока оно находится в режиме foreground . Это означает, что если ваше приложение находится в фоновом режиме и пытается создать службу переднего плана типа камеры, местоположения или микрофона, система видит, что у вашего приложения в данный момент нет требуемых разрешений, и выдает SecurityException
.
Аналогично, если ваше приложение работает в фоновом режиме и создает службу здравоохранения, которой требуется разрешение BODY_SENSORS
, у приложения в данный момент нет этого разрешения, и система выдает исключение. (Это не применяется, если это служба здравоохранения, которой требуются другие разрешения, например ACTIVITY_RECOGNITION
.) Вызов PermissionChecker.checkSelfPermission()
не предотвращает эту проблему. Если у вашего приложения есть разрешение while-in-use, и оно вызывает 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
Приложения, предназначенные для Android 12 (уровень API 31) или выше, не могут запускать службы переднего плана, пока приложение работает в фоновом режиме, за исключением нескольких особых случаев . Если приложение пытается запустить службу переднего плана, пока приложение работает в фоновом режиме, и служба переднего плана не удовлетворяет одному из исключительных случаев, система выдает исключение ForegroundServiceStartNotAllowedException
.
Кроме того, если приложение хочет запустить службу переднего плана, которой требуются разрешения во время использования (например, датчик тела, камера, микрофон или разрешения на местоположение), оно не может создать службу, пока приложение находится в фоновом режиме, даже если приложение попадает под одно из исключений из ограничений на запуск в фоновом режиме. Причина этого объясняется в разделе Ограничения на запуск служб переднего плана, которым требуются разрешения во время использования .
Освобождение от ограничений на фоновое начало
В следующих ситуациях ваше приложение может запускать службы переднего плана, даже если оно работает в фоновом режиме:
- Ваше приложение переходит из видимого пользователю состояния, например, из активности .
- Ваше приложение может запустить действие из фонового режима , за исключением случая, когда приложение имеет действие в стеке задач назад существующей задачи.
Ваше приложение получает высокоприоритетное сообщение с помощью Firebase Cloud Messaging .
Пользователь выполняет действие над элементом пользовательского интерфейса, связанным с вашим приложением. Например, он может взаимодействовать с пузырем , уведомлением , виджетом или действием.
Ваше приложение вызывает точный сигнал тревоги для выполнения действия, запрошенного пользователем.
Ваше приложение — это текущий метод ввода на устройстве.
Ваше приложение получает событие, связанное с геозонированием или переходом в режим распознавания активности .
После перезагрузки устройства и получения действия намерения
ACTION_BOOT_COMPLETED
,ACTION_LOCKED_BOOT_COMPLETED
илиACTION_MY_PACKAGE_REPLACED
в широковещательном приемнике .Ваше приложение получает действие намерения
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
.
Для разрешений while-in-use это может привести к потенциальной проблеме. Если у вашего приложения есть разрешение while-in-use, оно будет иметь его только пока оно находится в режиме foreground . Это означает, что если ваше приложение находится в фоновом режиме и пытается создать службу переднего плана типа камеры, местоположения или микрофона, система видит, что у вашего приложения в данный момент нет требуемых разрешений, и выдает SecurityException
.
Аналогично, если ваше приложение работает в фоновом режиме и создает службу здравоохранения, которой требуется разрешение BODY_SENSORS
, у приложения в данный момент нет этого разрешения, и система выдает исключение. (Это не применяется, если это служба здравоохранения, которой требуются другие разрешения, например ACTIVITY_RECOGNITION
.) Вызов PermissionChecker.checkSelfPermission()
не предотвращает эту проблему. Если у вашего приложения есть разрешение while-in-use, и оно вызывает 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