Tipos de servicios en primer plano

A partir de Android 14 (API nivel 34), debes declarar un tipo de servicio adecuado para cada servicio en primer plano. Esto significa que debes declarar el tipo de servicio en el manifiesto de tu app y también solicitar el permiso de servicio en primer plano adecuado para ese tipo (además de solicitar el permiso FOREGROUND_SERVICE). Además, según el tipo de servicio en primer plano, es posible que debas solicitar permisos de tiempo de ejecución antes de iniciar el servicio.

Cámara

Foreground service type to declare in manifest under android:foregroundServiceType
camera
Permission to declare in your manifest
FOREGROUND_SERVICE_CAMERA
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_CAMERA
Runtime prerequisites

Request and be granted the CAMERA runtime permission

Description

Continue to access the camera from the background, such as video chat apps that allow for multitasking.

Dispositivo conectado

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

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

说明

与需要蓝牙、NFC、IR、USB 或网络连接的外部设备进行互动。

替代方案

如果您的应用需要向外部设备持续传输数据,请考虑改用配套设备管理器。使用配套设备感知 API,可帮助您的应用在配套设备在范围内时保持运行。

如果您的应用需要扫描蓝牙设备,请考虑改用 Bluetooth Scan API

Sincronización de datos

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.

Salud

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

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

说明

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

Ubicación

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

用户必须已启用位置信息服务,并且应用必须至少获得以下一项运行时权限:

说明

需要位置信息使用权的长时间运行的用例,例如导航和位置信息分享。

替代方案

如果您的应用需要在用户到达特定位置时触发,请考虑改用 Geofence API

Contenido multimedia

Foreground service type to declare in manifest under
android:foregroundServiceType
mediaPlayback
Permission to declare in your manifest
FOREGROUND_SERVICE_MEDIA_PLAYBACK
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
Runtime prerequisites
None
Description

Continue audio or video playback from the background. Support Digital Video Recording (DVR) functionality on Android TV.

Alternatives

If you're showing picture-in-picture video, use Picture-in-Picture mode.

Procesando archivos multimedia

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

Es un servicio para realizar operaciones que requieren mucho tiempo en los recursos multimedia, como convertir contenido multimedia a diferentes formatos. El sistema le permite a este servicio un tiempo limitado para ejecutarse. En circunstancias normales, este límite de tiempo sería de 6 horas de cada 24. (Todos los servicios en primer plano mediaProcessing de una app comparten este límite).

Tu app debe detener manualmente el servicio de procesamiento de contenido multimedia en la siguiente situación:

Si se alcanza el tiempo de espera, el sistema llama al método Service.onTimeout(int, int) del servicio. En este momento, el servicio tiene unos segundos para llamar a Service.stopSelf(). Si el servicio no llama a Service.stopSelf(), se producirá un error de ANR con este mensaje de error: "Un servicio en primer plano de <fgs_type> no se detuvo dentro del tiempo de espera: <component_name>".

Nota: Service.onTimeout(int, int) no está disponible en Android 14 ni versiones anteriores. En los dispositivos que ejecutan esas versiones, si un servicio de procesamiento de contenido multimedia alcanza el período de tiempo de espera, el sistema almacena en caché la app de inmediato. Por este motivo, tu app no debe esperar a recibir una notificación de tiempo de espera. En su lugar, debe finalizar el servicio en primer plano o cambiarlo a un servicio en segundo plano lo antes posible.

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

要在清单中声明的前台服务类型,位于
android:foregroundServiceType
microphone
要在清单中声明的权限
FOREGROUND_SERVICE_MICROPHONE
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_MICROPHONE
运行时前提条件

请求并被授予 RECORD_AUDIO 运行时权限。

说明

在后台继续捕获麦克风内容,例如录音器或通信应用。

Llamada telefónica

Tipo de servicio en primer plano que se declarará en el manifiesto en
android:foregroundServiceType
phoneCall
Permiso que se debe declarar en el manifiesto
FOREGROUND_SERVICE_PHONE_CALL
Constante para pasar a startForeground()
FOREGROUND_SERVICE_TYPE_PHONE_CALL
Requisitos previos del tiempo de ejecución

Debe cumplirse al menos una de las siguientes condiciones:

  • La app es la app de teléfono predeterminada a través del rol de ROLE_DIALER.
Descripción

Continúa una llamada en curso con las APIs de ConnectionService.

Alternativas

Si necesitas hacer llamadas telefónicas, de video o por VoIP, considera usar la biblioteca android.telecom.

Considera usar CallScreeningService para filtrar llamadas.

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

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>

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.