Укажите типы приоритетных служб.

为了帮助开发者更有目的地定义面向用户的前台服务,Android 10 在 <service> 元素内引入了 android:foregroundServiceType 属性。

如果您的应用以 Android 14 为目标平台,则必须指定适当的前台服务类型。与以前的 Android 版本一样,可组合使用多个类型。下面列出了可供选择的前台服务类型:

如果应用中的用例与这些类型均不相关,强烈建议您迁移逻辑以使用 WorkManager用户发起的数据传输作业

Android 14 中新增了 health, remoteMessaging, shortService, specialUsesystemExempted 类型。

以下代码段提供了一个清单中的前台服务类型声明示例:

<manifest ...>
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
    <application ...>
      <service
          android:name=".MyMediaPlaybackService"
          android:foregroundServiceType="mediaPlayback"
          android:exported="false">
      </service>
    </application>
</manifest>

如果以 Android 14 为目标平台的应用未在清单中定义给定服务的类型,系统会在调用 startForeground() 时引发 MissingForegroundServiceTypeException

Объявить новое разрешение на использование типов служб переднего плана

如果以 Android 14 为目标平台的应用使用前台服务,则必须根据前台服务类型声明 Android 14 中引入的特定权限。这些权限显示在本页每种前台服务类型的预期用例和强制执行部分中标记为“您必须在清单文件中声明的权限”的部分。

所有这些权限都定义为一般权限,并默认授予。用户无法撤消这些权限。

Включить тип службы переднего плана во время выполнения

Лучше всего для приложений, запускающих службы переднего плана, использовать версию startForeground() для ServiceCompat (доступную в androidx-core 1.12 и выше), куда вы передаете поразрядное целое число типов служб переднего плана. Вы можете передать одно или несколько значений типа.

Обычно вам следует объявлять только те типы, которые необходимы для конкретного варианта использования. Это упрощает удовлетворение ожиданий системы для каждого типа приоритетных служб . В случаях, когда служба переднего плана запускается с несколькими типами, она должна соответствовать требованиям платформы всех типов.

ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)

Если тип службы переднего плана не указан в вызове, по умолчанию для этого типа используются значения, определенные в манифесте. Если вы не указали тип службы в манифесте, система выдает исключение MissingForegroundServiceTypeException .

Если службе переднего плана потребуются новые разрешения после ее запуска, вам следует снова вызвать startForeground() и добавить новые типы служб. Например, предположим, что фитнес-приложение запускает службу отслеживания бега, которой всегда нужна информация location , но могут потребоваться или не потребоваться разрешения на использование media . Вам нужно будет объявить location и mediaPlayback в манифесте. Если пользователь начинает прогон и просто хочет отслеживать свое местоположение, ваше приложение должно вызвать startForeground() и передать только тип службы location . Затем, если пользователь хочет начать воспроизведение аудио, снова вызовите startForeground() и передайте location|mediaPlayback .

Проверка времени работы системы

Система проверяет правильность использования типов служб переднего плана и подтверждает, что приложение запросило правильные разрешения во время выполнения или использует необходимые API. Например, система ожидает, что приложения, использующие тип службы переднего плана FOREGROUND_SERVICE_TYPE_LOCATION , будут запрашивать либо ACCESS_COARSE_LOCATION , либо ACCESS_FINE_LOCATION .

Это означает, что приложения должны следовать очень определенному порядку операций при запросе разрешений у пользователя и запуске служб переднего плана. Разрешения должны быть запрошены и предоставлены до того, как приложение попытается вызвать startForeground() . Приложения, которые запрашивают соответствующие разрешения после запуска службы переднего плана, должны изменить этот порядок операций и запрашивать разрешение перед запуском службы переднего плана.

Особенности принудительного применения платформы представлены в разделах с надписью «Требования к среде выполнения» в предполагаемых вариантах использования и принудительном исполнении для каждого раздела типа службы приоритетного плана на этой странице.

Предполагаемые варианты использования и соблюдение требований для каждого типа службы приоритета.

为了使用给定的前台服务类型,您必须在清单文件中声明特定权限,必须满足特定的运行时要求,并且应用必须满足该类型的其中一组预期用例。以下部分介绍了您必须声明的权限、运行时前提条件以及每种类型的预期用例。

Камера

Тип службы переднего плана, который нужно объявить в манифесте в разделе android:foregroundServiceType
camera
Разрешение объявить в своем манифесте
FOREGROUND_SERVICE_CAMERA
Константа для передачи в startForeground()
FOREGROUND_SERVICE_TYPE_CAMERA
Предварительные условия выполнения

Запросите и получите разрешение на выполнение CAMERA

Примечание. На разрешение выполнения CAMERA распространяются ограничения на использование. По этой причине вы не можете создать службу переднего плана camera , пока ваше приложение находится в фоновом режиме, за некоторыми исключениями . Дополнительные сведения см. в разделе Ограничения на запуск служб переднего плана, которым требуются разрешения во время использования .

Описание

Продолжайте получать доступ к камере в фоновом режиме, например, через приложения для видеочата, которые позволяют выполнять многозадачность.

Подключенное устройство

Тип службы переднего плана, который нужно объявить в манифесте в разделе
android:foregroundServiceType
connectedDevice
Разрешение объявить в своем манифесте
FOREGROUND_SERVICE_CONNECTED_DEVICE
Константа для передачи в startForeground()
FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
Предварительные требования для выполнения

Хотя бы одно из следующих условий должно быть истинным:

Описание

Взаимодействие с внешними устройствами, для которых требуется подключение Bluetooth, NFC, ИК-порт, USB или сетевое соединение.

Альтернативы

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

Если вашему приложению необходимо выполнить поиск устройств Bluetooth, рассмотрите возможность использования вместо этого API сканирования Bluetooth .

Синхронизация данных

Foreground service type to declare in manifest under
android:foregroundServiceType
dataSync
Permission to declare in your manifest
FOREGROUND_SERVICE_DATA_SYNC
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_DATA_SYNC
Runtime prerequisites
None
Description

Data transfer operations, such as the following:

  • Data upload or download
  • Backup-and-restore operations
  • Import or export operations
  • Fetch data
  • Local file processing
  • Transfer data between a device and the cloud over a network
Alternatives

See Alternatives to data sync foreground services for detailed information.

Здоровье

Тип службы переднего плана, который нужно объявить в манифесте в разделе
android:foregroundServiceType
health
Разрешение объявить в своем манифесте
FOREGROUND_SERVICE_HEALTH
Константа для передачи в startForeground()
FOREGROUND_SERVICE_TYPE_HEALTH
Предварительные требования для выполнения

Хотя бы одно из следующих условий должно быть истинным:

Примечание. На разрешение выполнения BODY_SENSORS распространяются ограничения на использование. По этой причине вы не можете создать приоритетную службу health , которая использует датчики тела, пока ваше приложение находится в фоновом режиме, за некоторыми исключениями . Дополнительные сведения см. в разделе Ограничения на запуск служб переднего плана, которым требуются разрешения во время использования .

Описание

Любые длительные сценарии использования для поддержки приложений из категории фитнеса, таких как трекеры тренировок.

,
Тип службы переднего плана, который нужно объявить в манифесте в разделе
android:foregroundServiceType
health
Разрешение объявить в своем манифесте
FOREGROUND_SERVICE_HEALTH
Константа для передачи в startForeground()
FOREGROUND_SERVICE_TYPE_HEALTH
Предварительные требования для выполнения

Хотя бы одно из следующих условий должно быть истинным:

Примечание. На разрешение выполнения BODY_SENSORS распространяются ограничения на использование. По этой причине вы не можете создать приоритетную службу health , которая использует датчики тела, пока ваше приложение находится в фоновом режиме, за некоторыми исключениями . Дополнительные сведения см. в разделе Ограничения на запуск служб переднего плана, которым требуются разрешения во время использования .

Описание

Любые длительные сценарии использования для поддержки приложений из категории фитнеса, таких как трекеры тренировок.

,
Тип службы переднего плана, который нужно объявить в манифесте в разделе
android:foregroundServiceType
health
Разрешение объявить в своем манифесте
FOREGROUND_SERVICE_HEALTH
Константа для передачи в startForeground()
FOREGROUND_SERVICE_TYPE_HEALTH
Предварительные требования для выполнения

Хотя бы одно из следующих условий должно быть истинным:

Примечание. На разрешение выполнения BODY_SENSORS распространяются ограничения на использование. По этой причине вы не можете создать приоритетную службу health , которая использует датчики тела, пока ваше приложение находится в фоновом режиме, за некоторыми исключениями . Дополнительные сведения см. в разделе Ограничения на запуск служб переднего плана, которым требуются разрешения во время использования .

Описание

Любые длительные сценарии использования для поддержки приложений из категории фитнеса, таких как трекеры тренировок.

,
Тип службы переднего плана, который нужно объявить в манифесте в разделе
android:foregroundServiceType
health
Разрешение объявить в своем манифесте
FOREGROUND_SERVICE_HEALTH
Константа для передачи в startForeground()
FOREGROUND_SERVICE_TYPE_HEALTH
Предварительные условия выполнения

Хотя бы одно из следующих условий должно быть истинным:

Примечание. На разрешение выполнения BODY_SENSORS распространяются ограничения на использование. По этой причине вы не можете создать приоритетную службу health , которая использует датчики тела, пока ваше приложение находится в фоновом режиме, за некоторыми исключениями . Дополнительные сведения см. в разделе Ограничения на запуск служб переднего плана, которым требуются разрешения во время использования .

Описание

Любые длительные варианты использования для поддержки приложений в категории фитнеса, таких как трекеры тренировок.

Расположение

Тип службы переднего плана, который нужно объявить в манифесте в разделе
android:foregroundServiceType
location
Разрешение объявить в вашем манифесте
FOREGROUND_SERVICE_LOCATION
Константа для передачи в startForeground()
FOREGROUND_SERVICE_TYPE_LOCATION
Предварительные требования для выполнения

У пользователя должны быть включены службы определения местоположения, а приложению должно быть предоставлено хотя бы одно из следующих разрешений во время выполнения:

Примечание. Чтобы проверить, включил ли пользователь службы определения местоположения, а также предоставил ли ему доступ к разрешениям среды выполнения, используйте PermissionChecker#checkSelfPermission()

Примечание. На разрешения выполнения местоположения распространяются ограничения во время использования. По этой причине вы не можете создать приоритетную службу определения location , пока ваше приложение находится в фоновом режиме, если вам не предоставлено разрешение среды выполнения ACCESS_BACKGROUND_LOCATION . Дополнительные сведения см. в разделе Ограничения на запуск служб переднего плана, которым требуются разрешения во время использования .

Описание

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

Альтернативы

Если ваше приложение должно запускаться, когда пользователь достигает определенных мест, рассмотрите возможность использования вместо этого API геозон .

СМИ

Тип службы переднего плана, который нужно объявить в манифесте в разделе
android:foregroundServiceType
mediaPlayback
Разрешение объявить в вашем манифесте
FOREGROUND_SERVICE_MEDIA_PLAYBACK
Константа для передачи в startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
Предварительные требования для выполнения
Никто
Описание
Продолжить воспроизведение аудио или видео в фоновом режиме. Поддержка функции цифровой видеозаписи (DVR) на Android TV .
Альтернативы
Если вы показываете видео «картинка в картинке», используйте режим «картинка в картинке» .

Медиа-проекция

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
mediaProjection
在清单中声明的权限
FOREGROUND_SERVICE_MEDIA_PROJECTION
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
运行时前提条件

在启动前台服务之前调用 createScreenCaptureIntent() 方法。这样做会向用户显示权限通知;用户必须先授予权限,您才能创建服务。

创建前台服务后,您可以调用 MediaProjectionManager.getMediaProjection()

说明

使用 MediaProjection API 将内容投影到非主要显示屏或外部设备。这些内容不必全都为媒体内容。

替代方案

如需将媒体流式传输到其他设备,请使用 Google Cast SDK

Микрофон

Foreground service type to declare in manifest under
android:foregroundServiceType
microphone
Permission to declare in your manifest
FOREGROUND_SERVICE_MICROPHONE
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_MICROPHONE
Runtime prerequisites

Request and be granted the RECORD_AUDIO runtime permission.

Note: The RECORD_AUDIO runtime permission is subject to while-in-use restrictions. For this reason, you cannot create a microphone foreground service while your app is in the background, with a few exceptions. For more information, see Restrictions on starting foreground services that need while-in-use permissions.

Description

Continue microphone capture from the background, such as voice recorders or communication apps.

Телефонный звонок

Foreground service type to declare in manifest under
android:foregroundServiceType
phoneCall
Permission to declare in your manifest
FOREGROUND_SERVICE_PHONE_CALL
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_PHONE_CALL
Runtime prerequisites

At least one of these conditions must be true:

  • App is the default dialer app through the ROLE_DIALER role.
Description

Continue an ongoing call using the ConnectionService APIs.

Alternatives

If you need to make phone, video, or VoIP calls, consider using the android.telecom library.

Consider using CallScreeningService to screen calls.

Удаленный обмен сообщениями

Foreground service type to declare in manifest under
android:foregroundServiceType
remoteMessaging
Permission to declare in your manifest
FOREGROUND_SERVICE_REMOTE_MESSAGING
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
Runtime prerequisites
None
Description
Transfer text messages from one device to another. Assists with continuity of a user's messaging tasks when they switch devices.

Короткое обслуживание

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
shortService
在清单中声明的权限
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE
运行时前提条件
说明

快速完成不可中断或推迟的关键工作。

这种类型有一些独特的特征:

  • 只能持续运行一小段时间(大约 3 分钟)。
  • 不支持粘性前台服务。
  • 无法启动其他前台服务。
  • 不需要类型专用权限,不过它仍需要 FOREGROUND_SERVICE 权限。
  • 只有当应用当前符合启动新前台服务的条件时,shortService 才能更改为其他服务类型。
  • 前台服务可以随时将其类型更改为 shortService,届时超时期限将开始。

shortService 的超时时间从调用 Service.startForeground() 开始算起。应用应在发生超时之前调用 Service.stopSelf()Service.stopForeground()。否则,系统会调用新的 Service.onTimeout(),让应用有机会调用 stopSelf()stopForeground() 来停止其服务。

调用 Service.onTimeout() 后的短时间内,应用会进入缓存状态,并且不再被视为处于前台,除非用户正在主动与应用互动。应用缓存一小段时间后,服务还未停止,该应用会收到 ANR 消息。ANR 消息提及 FOREGROUND_SERVICE_TYPE_SHORT_SERVICE。出于这些原因,实现 Service.onTimeout() 回调被视为一种最佳实践。

Android 13 及更低版本中不存在 Service.onTimeout() 回调。如果同一服务在此类设备上运行,则不会出现超时,也不会发生 ANR。确保您的服务在完成处理任务后立即停止,即使它尚未收到 Service.onTimeout() 回调也是如此。

请务必注意,如果未遵循 shortService 的超时设置,即使应用还有其他有效的前台服务或其他应用生命周期进程,应用也会遇到 ANR。

如果应用对用户可见,或满足允许从后台启动前台服务的某一豁免条件,则使用 FOREGROUND_SERVICE_TYPE_SHORT_SERVICE 参数再次调用 Service.StartForeground() 会将超时时间再延长 3 分钟。如果应用对用户不可见且不满足其中一个豁免条件,则尝试启动其他前台服务(无论其类型如何)都会导致 ForegroundServiceStartNotAllowedException

即使用户为您的应用停用电池优化功能,仍然会受到 shortService FGS 的影响。

如果您启动包含 shortService 类型和另一个前台服务类型的前台服务,系统会忽略 shortService 类型声明。不过,该服务仍必须遵守其他声明类型的先决条件。如需了解详情,请参阅前台服务文档

Специальное использование

Foreground service type to declare in manifest under
android:foregroundServiceType
specialUse
Permission to declare in your manifest
FOREGROUND_SERVICE_SPECIAL_USE
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
Runtime prerequisites
None
Description

Covers any valid foreground service use cases that aren't covered by the other foreground service types.

In addition to declaring the FOREGROUND_SERVICE_TYPE_SPECIAL_USE foreground service type, developers should declare use cases in the manifest. To do so, they specify the <property> element within the <service> element. These values and corresponding use cases are reviewed when you submit your app in the Google Play Console. The use cases you provide are free-form, and you should make sure to provide enough information to let the reviewer see why you need to use the specialUse type.

<service android:name="fooService" android:foregroundServiceType="specialUse">
  <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE"
      android:value="explanation_for_special_use"/>
</service>

Система освобождена

Foreground service type to declare in manifest under
android:foregroundServiceType
systemExempted
Permission to declare in your manifest
FOREGROUND_SERVICE_SYSTEM_EXEMPTED
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED
Runtime prerequisites
None
Description

Reserved for system applications and specific system integrations, to continue to use foreground services.

To use this type, an app must meet at least one of the following criteria:

  • Device is in demo mode state
  • App is a Device Owner
  • App is a Profiler Owner
  • Safety Apps that have the ROLE_EMERGENCY role
  • Device Admin apps
  • Apps holding SCHEDULE_EXACT_ALARM or USE_EXACT_ALARM permission and are using Foreground Service to continue alarms in the background, including haptics-only alarms.
  • VPN apps (configured using Settings > Network & Internet > VPN)

    Otherwise, declaring this type causes the system to throw a ForegroundServiceTypeNotAllowedException.

Применение политики Google Play для использования типов приоритетных служб

If your app targets Android 14 or higher, you'll need to declare your app's foreground service types in the Play Console's app content page (Policy > App content). For more information on how to declare your foreground service types in Play Console, see Understanding foreground service and full-screen intent requirements.