Tipos de servicios en primer plano

A partir de Android 14 (nivel de API 34), debes declarar un tipo de servicio adecuado para cada servicio en primer plano. Eso significa que debes declarar el tipo de servicio en el manifiesto de la app y también solicitar el permiso de servicio en primer plano adecuado para ese tipo (además de solicitar el FOREGROUND_SERVICE permiso). 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

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

Solicitar y obtener el permiso de tiempo de ejecución CAMERA

Descripción

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

Tipo de servicio en primer plano que se declarará en el manifiesto en
android:foregroundServiceType
health
Permiso para declarar en tu manifiesto
FOREGROUND_SERVICE_HEALTH
Es la constante que se pasa a startForeground().
FOREGROUND_SERVICE_TYPE_HEALTH
Requisitos previos del entorno de ejecución

Debe cumplirse mínimo una de las siguientes condiciones:

Descripción

Cualquier caso de uso de larga duración para admitir apps de la categoría de entrenamiento, como monitoreos de ejercicios

Ubicación

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

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

说明

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

替代方案

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

Medios

Tipo de servicio en primer plano que se declarará en el manifiesto en
android:foregroundServiceType
mediaPlayback
Permiso que se debe declarar en el manifiesto
FOREGROUND_SERVICE_MEDIA_PLAYBACK
Constante para pasar a startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
Requisitos previos del tiempo 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 muestras un video en pantalla en pantalla, usa el modo de pantalla en pantalla.

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

Foreground service type to declare in manifest under
android:foregroundServiceType
mediaProjection
Permission to declare in your manifest
FOREGROUND_SERVICE_MEDIA_PROJECTION
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
Runtime prerequisites

Call the createScreenCaptureIntent() method before starting the foreground service. Doing so shows a permission notification to the user; the user must grant the permission before you can create the service.

After you have created the foreground service, you can call MediaProjectionManager.getMediaProjection().

Description

Project content to non-primary display or external device using the MediaProjection APIs. This content doesn't have to be exclusively media content.

Alternatives

To stream media to another device, use the 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.

Description

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

Llamada telefónica

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

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

  • 应用是默认拨号器应用(通过 ROLE_DIALER 角色)。
说明

使用 ConnectionService API 继续当前通话。

替代方案

如果您需要拨打电话、视频通话或 VoIP 通话,请考虑使用 android.telecom 库。

考虑使用 CallScreeningService 来过滤通话。

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

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

Finaliza con rapidez tareas importantes que no se puedan interrumpir ni posponer.

Este tipo tiene algunas características únicas:

  • Solo se puede ejecutar por un período breve (alrededor de 3 minutos).
  • No admite servicios fijos en primer plano.
  • No se pueden iniciar otros servicios en primer plano.
  • No requiere un permiso específico para el tipo, aunque sí el permiso FOREGROUND_SERVICE.
  • Un shortService solo puede cambiar a otro tipo de servicio si la app es actualmente apta para iniciar un nuevo servicio en primer plano.
  • Un servicio en primer plano puede cambiar su tipo a shortService en cualquier momento, en cuyo punto comienza el período de tiempo de espera.

El tiempo de espera para shortService comienza desde el momento en que se llama a Service.startForeground(). Se espera que la app llame a Service.stopSelf() o Service.stopForeground() antes de que se agote el tiempo de espera. De lo contrario, se llama al nuevo Service.onTimeout(), lo que les brinda a las apps una breve oportunidad para llamar a stopSelf() o stopForeground() para detener su servicio.

Poco tiempo después de llamar a Service.onTimeout(), la app entra en un estado almacenado en caché y ya no se considera en primer plano, a menos que el usuario interactúe, de manera activa, con la app. Poco tiempo después de que la app se almacena en caché, y el servicio no se detiene, la app recibe un mensaje de ANR. Este mensaje menciona FOREGROUND_SERVICE_TYPE_SHORT_SERVICE. Por estos motivos, te recomendamos que, como práctica recomendada, implementes la devolución de llamada a Service.onTimeout().

La devolución de llamada a Service.onTimeout() no existe en Android 13 y versiones anteriores. Si el mismo servicio se ejecuta en esos dispositivos, no recibirá un tiempo de espera ni un mensaje de ANR. Asegúrate de que el servicio se detenga en cuanto finalice la tarea de procesamiento, incluso si todavía no recibió la devolución de llamada a Service.onTimeout().

Es importante tener en cuenta que, si no se respeta el tiempo de espera de shortService, la app mostrará un error de ANR, incluso si tiene otros servicios en primer plano válidos u otros procesos del ciclo de vida de la app en ejecución.

Si una app es visible para el usuario o satisface una de las exenciones que permiten que se inicien los servicios en primer plano desde el segundo plano, volver a llamar a Service.StartForeground() con el parámetro FOREGROUND_SERVICE_TYPE_SHORT_SERVICE extiende el tiempo de espera por otros 3 minutos. Si la app no es visible para el usuario y no satisface una de las exenciones, cualquier intento de iniciar otro servicio en primer plano, independientemente del tipo, producirá ForegroundServiceStartNotAllowedException.

Si un usuario inhabilita la optimización de la batería de tu app, de todos modos, se verá afectada por el tiempo de espera del servicio en primer plano de shortService.

Si inicias un servicio en primer plano que incluye el tipo shortService y otro tipo de servicio en primer plano, el sistema ignora la declaración del tipo shortService. Sin embargo, el servicio debe cumplir con los requisitos previos de los otros tipos declarados. Para obtener más información, consulta la documentación de los servicios en primer plano.

Uso especial

要在清单中声明的前台服务类型
android:foregroundServiceType
specialUse
在清单中声明的权限
FOREGROUND_SERVICE_SPECIAL_USE
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
运行时前提条件
说明

涵盖其他前台服务类型未涵盖的所有有效前台服务用例。

除了声明 FOREGROUND_SERVICE_TYPE_SPECIAL_USE 前台服务类型之外,开发者还应在清单中声明用例。为此,他们会在 <service> 元素内指定 <property> 元素。这些值和相应的应用场景 。用途 您提供的案例均为自由形式,因此,您应确保提供足够的 相关信息,让审核人员了解您为何需要使用 specialUse 类型。

<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

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

Reservado para aplicaciones del sistema, además de integraciones de sistemas específicos, para seguir usando los servicios en primer plano.

Para usar este tipo, una app debe cumplir con mínimo uno de los siguientes criterios:

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.