Los tipos de servicio en primer plano son obligatorios

Para permitir que los desarrolladores sean más conscientes con la definición de los servicios en primer plano para el usuario, en Android 10, se introdujo el atributo android:foregroundServiceType dentro del elemento <service>.

Si tu app está orientada a Android 14, debe especificar los tipos correctos de servicio en primer plano. Al igual que en versiones anteriores de Android, se pueden combinar varios tipos de servicios. En esta lista, se muestran los tipos de servicios en primer plano que puedes elegir:

Si un caso de uso en tu app no está asociado con ninguno de estos tipos, te recomendamos que migres la lógica para usar WorkManager o tareas de transferencia de datos que inicia el usuario..

Los tipos health, remoteMessaging, shortService, specialUse y systemExempted son nuevos en Android 14.

En el siguiente fragmento de código, se brinda el ejemplo de una declaración de tipo de servicio en primer plano en el manifiesto:

<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>

Si una app orientada a Android 14 no define tipos para un servicio determinado en el manifiesto, el sistema generará MissingForegroundServiceTypeException cuando se llame a startForeground() para ese servicio.

Declara un nuevo permiso para usar tipos de servicio en primer plano

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

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

Incluye el tipo de servicio en primer plano durante el tiempo de ejecución

对于启动前台服务的应用,最佳实践是使用 startForeground()ServiceCompat 版本(在 androidx-core 1.12 及更高版本中提供),并在其中传入前台服务类型的按位整数。您可以选择传递一个或多个类型值。

通常,您应仅声明特定用例所需的类型。这样可以更轻松地满足系统对每种前台服务类型的预期。如果某项前台服务以多种类型启动,则该前台服务必须遵守所有类型的平台强制执行要求

ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)

如果在调用中未指定前台服务类型,则类型默认为清单中定义的值。如果您未在清单中指定服务类型,系统会抛出 MissingForegroundServiceTypeException

如果前台服务在启动后需要新权限,您应再次调用 startForeground() 并添加新的服务类型。例如,假设一款健身应用运行一项始终需要 location 信息但可能不需要 media 权限的跑步跟踪器服务。您需要在清单中同时声明 locationmediaPlayback。如果用户开始跑步,只希望跟踪其位置信息,您的应用应调用 startForeground(),并仅传递 location 服务类型。然后,如果用户想开始播放音频,请再次调用 startForeground() 并传递 location|mediaPlayback

Verificaciones del tiempo de ejecución del sistema

系统会检查前台服务类型的使用是否恰当,并确认应用是否已请求适当的运行时权限或使用所需的 API。例如,系统希望使用前台服务类型 FOREGROUND_SERVICE_TYPE_LOCATION 的应用请求 ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION

这意味着,在向用户请求权限和启动前台服务时,应用必须遵循非常具体的操作顺序。应用在尝试调用 startForeground() 之前,必须先请求并获得所需的权限。在启动前台服务后请求相应权限的应用必须更改此顺序,并在启动前台服务之前请求该权限。

本页面的每种前台服务类型的预期用例和强制执行部分中标记为“运行时要求”的部分列出了平台强制执行的具体内容。

Casos de uso previstos y aplicación forzosa para cada tipo de servicio en primer plano

Para usar un tipo determinado de servicio en primer plano, debes declarar un permiso particular en tu archivo de manifiesto, además de cumplir con requisitos específicos del tiempo de ejecución. Tu app también debe cumplir con uno de los conjuntos de casos de uso previstos para ese tipo. En las siguientes secciones, se explica el permiso que debes declarar, los requisitos previos del tiempo de ejecución y los casos de uso previstos para cada tipo.

Cámara

Tipo de servicio en primer plano que se declarará en el manifiesto en android:foregroundServiceType
camera
Permiso para declarar en tu manifiesto
FOREGROUND_SERVICE_CAMERA
Constante para pasar a startForeground()
FOREGROUND_SERVICE_TYPE_CAMERA
Requisitos previos del entorno de ejecución

Solicita y obtén el permiso de tiempo de ejecución CAMERA

Nota: El permiso de tiempo de ejecución CAMERA está sujeto a restricciones durante el uso. Por este motivo, no puedes crear un servicio en primer plano de camera mientras la app está en segundo plano, con algunas excepciones. Para obtener más información, consulta Restricciones para iniciar servicios en primer plano que necesitan permisos durante el uso.

Descripción

Continúa accediendo a la cámara en segundo plano, como las apps de videochat que permiten realizar varias tareas a la vez.

Dispositivo conectado

Tipo de servicio en primer plano que se declarará en el manifiesto en
android:foregroundServiceType
connectedDevice
Permiso para declarar en tu manifiesto
FOREGROUND_SERVICE_CONNECTED_DEVICE
Constante para pasar a startForeground()
FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
Requisitos previos del entorno de ejecución

Debe cumplirse mínimo una de las siguientes condiciones:

Descripción

Interacciones con dispositivos externos que requieren una conexión Bluetooth, NFC, IR, USB o de red.

Alternativas

Si la app necesita realizar una transferencia de datos continua a un dispositivo externo, considera usar el administrador de dispositivos complementarios. Usa la API de presencia de dispositivos complementarios para ayudar a que tu app siga ejecutándose mientras el dispositivo complementario esté dentro del alcance.

Si la app necesita buscar dispositivos Bluetooth, considera usar la API de búsqueda de Bluetooth.

Sincronización de datos

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

数据传输操作,例如:

  • 数据上传或下载
  • 备份和恢复操作
  • 导入或导出操作
  • 获取数据
  • 本地文件处理
  • 通过网络在设备和云端之间传输数据
替代方案

如需了解详情,请参阅数据同步前台服务的替代方案

Salud

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

必须至少满足以下其中一个条件:

注意BODY_SENSORS 运行时权限受使用时限制的约束。因此,除少数例外情况外,您无法在应用在后台运行时创建使用身体传感器的 health 前台服务。如需了解详情,请参阅与启动需要“使用时”权限的前台服务相关的限制

说明

为健身类别的应用(例如锻炼追踪器)提供支持的所有长时间运行的用例。

Ubicación

Tipo de servicio en primer plano que se declarará en el manifiesto en
android:foregroundServiceType
location
Permiso para declarar en tu manifiesto
FOREGROUND_SERVICE_LOCATION
Constante para pasar a startForeground()
FOREGROUND_SERVICE_TYPE_LOCATION
Requisitos previos del entorno de ejecución

El usuario debe haber habilitado los servicios de ubicación, y la app debe tener al menos uno de los siguientes permisos de tiempo de ejecución:

Nota: Para verificar que el usuario habilitó los servicios de ubicación y otorgó acceso a los permisos de tiempo de ejecución, usa PermissionChecker#checkSelfPermission().

Nota: Los permisos de tiempo de ejecución de la ubicación están sujetos a restricciones durante el uso. Por este motivo, no puedes crear un servicio en primer plano location mientras la app está en segundo plano, a menos que se te haya otorgado el permiso de tiempo de ejecución ACCESS_BACKGROUND_LOCATION. Para obtener más información, consulta Restricciones para iniciar servicios en primer plano que necesitan permisos durante el uso.

Descripción

Casos de uso de larga duración que requieren acceso a la ubicación, como la navegación y el uso compartido de la ubicación

Alternativas

Si tu app debe activarse cuando el usuario llega a ubicaciones específicas, considera usar la API de geovallado.

Contenido multimedia

Tipo de servicio en primer plano que se declarará en el manifiesto en
android:foregroundServiceType
mediaPlayback
Permiso para declarar en tu manifiesto
FOREGROUND_SERVICE_MEDIA_PLAYBACK
Constante para pasar a startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
Requisitos previos del entorno de ejecución
Ninguno
Descripción
Continúa la reproducción de audio o video en segundo plano. Compatibilidad con la función de grabación de video digital (DVR) en Android TV.
Alternativas
Si quieres mostrar un video en pantalla en pantalla, usa el modo Pantalla en pantalla.

Proyección de contenido multimedia

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

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

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

说明

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

替代方案

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

Micrófono

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.

Llamada telefónica

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.

Mensajería remota

Tipo de servicio en primer plano que se declarará en el manifiesto en
android:foregroundServiceType
remoteMessaging
Permiso para declarar en tu manifiesto
FOREGROUND_SERVICE_REMOTE_MESSAGING
Constante para pasar a startForeground()
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
Requisitos previos del entorno de ejecución
Ninguno
Descripción
Transfiere mensajes de texto de un dispositivo a otro. Brinda asistencia para la continuidad de las tareas de mensajería de un usuario cuando este cambia de dispositivo.

Servicio corto

要在清单中的以下位置声明的前台服务类型
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 类型声明。不过,该服务仍必须遵守其他声明类型的先决条件。如需了解详情,请参阅前台服务文档

Uso especial

Tipo de servicio en primer plano que se declarará en el manifiesto en
android:foregroundServiceType
specialUse
Permiso para declarar en tu manifiesto
FOREGROUND_SERVICE_SPECIAL_USE
Constante para pasar a startForeground()
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
Requisitos previos del entorno de ejecución
Ninguno
Descripción

Abarca todos los casos de uso válidos de servicios en primer plano que no están cubiertos por los otros tipos de servicios en primer plano.

Además de declarar el tipo de servicio en primer plano de FOREGROUND_SERVICE_TYPE_SPECIAL_USE, los desarrolladores deben declarar casos de uso en el manifiesto. Para ello, especifican el elemento <property> dentro del objeto <service>. Estos valores y los casos de uso correspondientes se revisan cuando envías tu app en Google Play Console. El uso son de formato libre, y debes asegurarte de proporcionar suficientes información para que el revisor pueda ver por qué necesitas usar specialUse el tipo de letra.

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

Sistema exento

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

为系统应用和特定系统集成预留,使其能继续使用前台服务。

如需使用此类型,应用必须至少满足以下条件之一:

Aplicación forzosa de las políticas de Google Play para usar tipos de servicios en primer plano

Si tu app se segmenta para Android 14 o versiones posteriores, deberás declarar los tipos de servicios en primer plano de la app en la página Contenido de la app de Play Console (Política > Contenido de la app). Para obtener más información sobre cómo declarar los tipos de servicios en primer plano en Play Console, consulta Información sobre los requisitos de los intents de pantalla completa y los servicios en primer plano.