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

Si las apps que se segmentan para Android 14 usan un servicio en primer plano, deben declarar un permiso específico, según el tipo de servicio en primer plano, que presenta Android 14. Estos permisos aparecen en las secciones etiquetadas como "permiso que debes declarar en tu archivo de manifiesto" en la sección de casos de uso previstos y aplicación forzosa de cada tipo de servicio en primer plano en esta página.

Todos los permisos se definen como permisos normales y se otorgan de forma predeterminada. Los usuarios no pueden revocar estos permisos.

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

La práctica recomendada para las aplicaciones que inician servicios en primer plano es usar la versión ServiceCompat de startForeground() (disponible en androidx-core 1.12 y versiones posteriores), en la que pasas un número entero a nivel de bits de los tipos de servicios en primer plano. Puedes pasar uno o más valores de tipo.

Por lo general, debes declarar solo los tipos necesarios para un caso de uso en particular. Esto facilita el cumplimiento de las expectativas del sistema para cada tipo de servicio en primer plano. En los casos en que un servicio en primer plano se inicia con varios tipos, el servicio en primer plano debe cumplir con los requisitos de aplicación de la plataforma de todos los tipos.

ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)

Si no se especifica el tipo de servicio en primer plano en la llamada, el tipo se establece de forma predeterminada en los valores definidos en el manifiesto. Si no especificaste el tipo de servicio en el manifiesto, el sistema arroja MissingForegroundServiceTypeException.

Si el servicio en primer plano necesita nuevos permisos después de iniciarlo, debes volver a llamar a startForeground() y agregar los nuevos tipos de servicio. Por ejemplo, supongamos que una app de fitness ejecuta un servicio de seguimiento de actividades de correr que siempre necesita información de location, pero que puede necesitar o no permisos de media. Debes declarar location y mediaPlayback en el manifiesto. Si un usuario inicia una actividad de correr y solo quiere que se haga un seguimiento de su ubicación, tu app debe llamar a startForeground() y pasar solo el tipo de servicio location. Luego, si el usuario quiere comenzar a reproducir audio, vuelve a llamar a startForeground() y pasa location|mediaPlayback.

Verificaciones del tiempo de ejecución del sistema

The system checks for proper use of foreground service types and confirms that the app has requested the proper runtime permissions or uses the required APIs. For instance, the system expects apps that use the foreground service type FOREGROUND_SERVICE_TYPE_LOCATION type to request either ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION.

This implies that apps must follow a very specific order of operations when requesting permissions from the user and starting foreground services. Permissions must be requested and granted before the app attempts to call startForeground(). Apps that request the appropriate permissions after the foreground service has been started must change this order of operations and request the permission before starting the foreground service.

The specifics of platform enforcement appear in the sections labeled "runtime requirements" in the intended use cases and enforcement for each foreground service type section on this page.

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

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

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

说明

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

替代方案

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

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

Sincronización de datos

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

Operaciones de transferencia de datos, como las siguientes:

  • Sube o descarga de datos
  • Operaciones de copia de seguridad y restablecimiento
  • Operaciones de importación o exportación
  • Cómo obtener datos
  • Procesamiento de archivos locales
  • Cómo transferir datos entre un dispositivo y la nube a través de una red
Alternativas

Consulta Alternativas a los servicios en primer plano de sincronización de datos para obtener información detallada.

Salud

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

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

注意:BODY_SENSORS 和基于传感器的读取运行时权限受“在使用时”限制。因此,除非您已获得 BODY_SENSORS_BACKGROUND(API 级别 33 到 35)或 READ_HEALTH_DATA_IN_BACKGROUND(API 级别 36 及更高级别)权限,否则您无法创建在应用处于后台运行时使用身体传感器的 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

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.

Proyección de contenido multimedia

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

Llama al método createScreenCaptureIntent() antes de iniciar el servicio en primer plano. De esta manera, se muestra una notificación de permiso al usuario, quien debe otorgar el permiso para que puedas crear el servicio.

Después de crear el servicio en primer plano, puedes llamar a MediaProjectionManager.getMediaProjection().

Descripción

Proyecta el contenido en un dispositivo externo o una pantalla no principal con las APIs de MediaProjection. No es necesario que este contenido sea solo multimedia.

Alternativas

Para transmitir contenido multimedia a otro dispositivo, usa el SDK de Google Cast.

Micrófono

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

请求并获得 RECORD_AUDIO 运行时权限。

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

说明

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

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

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

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

Tipo de servicio en primer plano que se declarará en el manifiesto en
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 y integraciones de sistemas específicos, para continuar 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.