为了帮助开发者更有目的地定义面向用户的前台服务,Android 10 在 <service>
元素内引入了 android:foregroundServiceType
属性。
如果您的应用以 Android 14 为目标平台,则必须指定适当的前台服务类型。与以前的 Android 版本一样,可组合使用多个类型。下面列出了可供选择的前台服务类型:
camera
connectedDevice
dataSync
health
location
mediaPlayback
mediaProjection
microphone
phoneCall
remoteMessaging
shortService
specialUse
systemExempted
如果应用中的用例与这些类型均不相关,强烈建议您迁移逻辑以使用 WorkManager 或用户发起的数据传输作业。
Android 14 中新增了 health, remoteMessaging, shortService, specialUse
和 systemExempted
类型。
以下代码段提供了一个清单中的前台服务类型声明示例:
<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
- Предварительные требования для выполнения
Хотя бы одно из следующих условий должно быть истинным:
Объявите разрешение
HIGH_SAMPLING_RATE_SENSORS
в своем манифесте.Запросите и получите хотя бы одно из следующих разрешений среды выполнения:
Примечание. На разрешение выполнения
BODY_SENSORS
распространяются ограничения на использование. По этой причине вы не можете создать приоритетную службуhealth
, которая использует датчики тела, пока ваше приложение находится в фоновом режиме, за некоторыми исключениями . Дополнительные сведения см. в разделе Ограничения на запуск служб переднего плана, которым требуются разрешения во время использования .- Описание
Любые длительные сценарии использования для поддержки приложений из категории фитнеса, таких как трекеры тренировок.
- Тип службы переднего плана, который нужно объявить в манифесте в разделе
-
android:foregroundServiceType
-
health
- Разрешение объявить в своем манифесте
-
FOREGROUND_SERVICE_HEALTH
- Константа для передачи в
startForeground()
-
FOREGROUND_SERVICE_TYPE_HEALTH
- Предварительные требования для выполнения
Хотя бы одно из следующих условий должно быть истинным:
Объявите разрешение
HIGH_SAMPLING_RATE_SENSORS
в своем манифесте.Запросите и получите хотя бы одно из следующих разрешений среды выполнения:
Примечание. На разрешение выполнения
BODY_SENSORS
распространяются ограничения на использование. По этой причине вы не можете создать приоритетную службуhealth
, которая использует датчики тела, пока ваше приложение находится в фоновом режиме, за некоторыми исключениями . Дополнительные сведения см. в разделе Ограничения на запуск служб переднего плана, которым требуются разрешения во время использования .- Описание
Любые длительные сценарии использования для поддержки приложений из категории фитнеса, таких как трекеры тренировок.
- Тип службы переднего плана, который нужно объявить в манифесте в разделе
-
android:foregroundServiceType
-
health
- Разрешение объявить в своем манифесте
-
FOREGROUND_SERVICE_HEALTH
- Константа для передачи в
startForeground()
-
FOREGROUND_SERVICE_TYPE_HEALTH
- Предварительные требования для выполнения
Хотя бы одно из следующих условий должно быть истинным:
Объявите разрешение
HIGH_SAMPLING_RATE_SENSORS
в своем манифесте.Запросите и получите хотя бы одно из следующих разрешений среды выполнения:
Примечание. На разрешение выполнения
BODY_SENSORS
распространяются ограничения на использование. По этой причине вы не можете создать приоритетную службуhealth
, которая использует датчики тела, пока ваше приложение находится в фоновом режиме, за некоторыми исключениями . Дополнительные сведения см. в разделе Ограничения на запуск служб переднего плана, которым требуются разрешения во время использования .- Описание
Любые длительные сценарии использования для поддержки приложений из категории фитнеса, таких как трекеры тренировок.
- Тип службы переднего плана, который нужно объявить в манифесте в разделе
-
android:foregroundServiceType
-
health
- Разрешение объявить в своем манифесте
-
FOREGROUND_SERVICE_HEALTH
- Константа для передачи в
startForeground()
-
FOREGROUND_SERVICE_TYPE_HEALTH
- Предварительные условия выполнения
Хотя бы одно из следующих условий должно быть истинным:
Объявите разрешение
HIGH_SAMPLING_RATE_SENSORS
в своем манифесте.Запросите и получите хотя бы одно из следующих разрешений среды выполнения:
Примечание. На разрешение выполнения
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 amicrophone
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 has declared the
MANAGE_OWN_CALLS
permission in its manifest file.
- App has declared the
- App is the default dialer app through the
ROLE_DIALER
role.
- App is the default dialer app through the
- 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 thespecialUse
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
orUSE_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.