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

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

Tipo de servicio en primer plano que se declarará en el manifiesto en
android:foregroundServiceType
dataSync
Permiso que se debe declarar en el manifiesto
FOREGROUND_SERVICE_DATA_SYNC
Constante para pasar a startForeground()
FOREGROUND_SERVICE_TYPE_DATA_SYNC
Requisitos previos del tiempo 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

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

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
Es la constante que se pasa 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:

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.

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

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

Llama al método createScreenCaptureIntent() antes de iniciar el servicio en primer plano. Si lo haces, se mostrará una notificación de permiso al usuario, que deberá otorgar el permiso antes de 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 MediaProjection APIs. 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

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

Solicita y obtén el permiso de tiempo de ejecución RECORD_AUDIO.

Descripción

Continúa con la captura de micrófono en segundo plano, como las grabadoras de voz o las apps de comunicación.

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

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

Quickly finish critical work that cannot be interrupted or postponed.

This type has some unique characteristics:

  • Can only run for a short period of time (about 3 minutes).
  • No support for sticky foreground services.
  • Cannot start other foreground services.
  • Doesn't require a type-specific permission, though it still requires the FOREGROUND_SERVICE permission.
  • A shortService can only change to another service type if the app is currently eligible to start a new foreground service.
  • A foreground service can change its type to shortService at any time, at which point the timeout period begins.

The timeout for shortService begins from the moment that Service.startForeground() is called. The app is expected to call Service.stopSelf() or Service.stopForeground() before the timeout occurs. Otherwise, the new Service.onTimeout() is called, giving apps a brief opportunity to call stopSelf() or stopForeground() to stop their service.

A short time after Service.onTimeout() is called, the app enters a cached state and is no longer considered to be in the foreground, unless the user is actively interacting with the app. A short time after the app is cached and the service has not stopped, the app receives an ANR. The ANR message mentions FOREGROUND_SERVICE_TYPE_SHORT_SERVICE. For these reasons, it's considered best practice to implement the Service.onTimeout() callback.

The Service.onTimeout() callback doesn't exist on Android 13 and lower. If the same service runs on such devices, it doesn't receive a timeout, nor does it ANR. Make sure that your service stops as soon as it finishes the processing task, even if it hasn't received the Service.onTimeout() callback yet.

It's important to note that if the timeout of the shortService is not respected, the app will ANR even if it has other valid foreground services or other app lifecycle processes running.

If an app is visible to the user or satisfies one of the exemptions that allow foreground services to be started from the background, calling Service.StartForeground() again with the FOREGROUND_SERVICE_TYPE_SHORT_SERVICE parameter extends the timeout by another 3 minutes. If the app isn't visible to the user and doesn't satisfy one of the exemptions, any attempt to start another foreground service, regardless of type, causes a ForegroundServiceStartNotAllowedException.

If a user disables battery optimization for your app, it's still affected by the timeout of shortService FGS.

If you start a foreground service that includes the shortService type and another foreground service type, the system ignores the shortService type declaration. However, the service must still adhere to the prerequisites of the other declared types. For more information, see the Foreground services documentation.

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