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

Приложения, предназначенные для 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
,

Приложения, предназначенные для 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