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

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

In addition, if an app wants to launch a foreground service that needs while-in-use permissions (for example, body sensor, camera, microphone, or location permissions), it cannot create the service while the app is in the background, even if the app falls into one of the exemptions from background start restrictions. The reason for this is explained in the section Restrictions on starting foreground services that need while-in-use permissions .

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

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

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

В Android 14 (уровень API 34) и выше существуют особые ситуации, о которых следует помнить при запуске фоновой службы, требующей разрешений во время использования.

If your app targets Android 14 or higher, the operating system checks when you create a foreground service to make sure your app has all the appropriate permissions for that service type. For example, when you create a foreground service of type microphone , the operating system verifies that your app currently has the RECORD_AUDIO permission. If you don't have that permission, the system throws a SecurityException .

For while-in-use permissions, this causes a potential problem. If your app has a while-in-use permission, it only has that permission while it's in the foreground . This means if your app is in the background, and it tries to create a foreground service of type camera, location, or microphone, the system sees that your app doesn't currently have the required permissions, and it throws a SecurityException .

Similarly, if your app is in the background and it creates a health service that needs the BODY_SENSORS permission, the app doesn't currently have that permission, and the system throws an exception. (This doesn't apply if it's a health service that needs different permissions, like ACTIVITY_RECOGNITION .) Calling PermissionChecker.checkSelfPermission() does not prevent this problem. If your app has a while-in-use permission, and it calls checkSelfPermission() to check if it has that permission, the method returns PERMISSION_GRANTED even if the app is in the background. When the method returns PERMISSION_GRANTED , it's saying "your app has this permission while the app is in use ."

По этой причине, если вашей службе, работающей в фоновом режиме, требуется разрешение на использование во время выполнения, необходимо вызывать 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