Ограничения на запуск службы переднего плана из фона

Приложения, ориентированные на Android 12 (уровень API 31) или выше, не могут запускать службы переднего плана, пока приложение работает в фоновом режиме, за исключением нескольких особых случаев . Если приложение пытается запустить службу переднего плана, пока оно работает в фоновом режиме, и эта служба не соответствует одному из исключительных случаев, система генерирует исключение ForegroundServiceStartNotAllowedException .

Кроме того, если приложение хочет запустить службу переднего плана, которой требуются разрешения во время использования (например, разрешение на доступ к датчикам тела, камере, микрофону или местоположению), оно не может создать эту службу, пока приложение находится в фоновом режиме, даже если приложение подпадает под одно из исключений из ограничений на запуск в фоновом режиме. Причина этого объясняется в разделе «Ограничения на запуск служб переднего плана, которым требуются разрешения во время использования» .

Исключения из ограничений на запуск фонового процесса

В следующих ситуациях ваше приложение может запускать службы переднего плана, даже если оно работает в фоновом режиме:

Ограничения на запуск служб переднего плана, которым требуются разрешения на использование во время их работы.

В 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