Los tipos de servicio en primer plano son obligatorios

To help developers be more intentional with defining user-facing foreground services, Android 10 introduced the android:foregroundServiceType attribute within the <service> element.

If your app targets Android 14, it must specify appropriate foreground service types. As in previous versions of Android, multiple types can be combined. This list shows the foreground service types to choose from:

If a use case in your app isn't associated with any of these types, we strongly recommend that you migrate your logic to use WorkManager or user-initiated data transfer jobs.

The health, remoteMessaging, shortService, specialUse, and systemExempted types are new in Android 14.

The following code snippet provides an example of a foreground service type declaration in the manifest:

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

If an app that targets Android 14 doesn't define types for a given service in the manifest, then the system will raise MissingForegroundServiceTypeException upon calling startForeground() for that service.

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

El sistema controla el uso adecuado de los tipos de servicios en primer plano y confirma si la app solicitó los permisos de tiempo de ejecución correspondientes o si usa las APIs requeridas. Por ejemplo, el sistema espera que las apps que usan el tipo FOREGROUND_SERVICE_TYPE_LOCATION de servicio en primer plano soliciten ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION.

Esto implica que las apps deben seguir un orden de operaciones muy específico cuando le solicitan permisos al usuario e inician servicios en primer plano. Se deben solicitar y obtener los permisos correspondientes antes de que la app llame a startForeground(). Las apps que solicitan los permisos correctos después de que se inicia el servicio en primer plano deben cambiar este orden de operaciones y solicitar el permiso antes de iniciar el servicio en primer plano.

Los detalles de la aplicación forzosa de la plataforma aparecen en las secciones etiquetadas como "requisitos del tiempo de ejecución" en las secciones de casos de uso previstos y de aplicación forzosa de cada tipo de servicio en primer plano en esta página.

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

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

Note: The CAMERA runtime permission is subject to while-in-use restrictions. For this reason, you cannot create a camera 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 to access the camera from the background, such as video chat apps that allow for multitasking.

Dispositivo conectado

Foreground service type to declare in manifest under
android:foregroundServiceType
connectedDevice
Permission to declare in your manifest
FOREGROUND_SERVICE_CONNECTED_DEVICE
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
Runtime prerequisites

At least one of the following conditions must be true:

Description

Interactions with external devices that require a Bluetooth, NFC, IR, USB, or network connection.

Alternatives

If your app needs to do continuous data transfer to an external device, consider using the companion device manager instead. Use the companion device presence API to help your app stay running while the companion device is in range.

If your app needs to scan for bluetooth devices, consider using the Bluetooth scan API instead.

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

Foreground service type to declare in manifest under
android:foregroundServiceType
health
Permission to declare in your manifest
FOREGROUND_SERVICE_HEALTH
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_HEALTH
Runtime prerequisites

At least one of the following conditions must be true:

Note: The BODY_SENSORS and sensor-based READ runtime permissions are subject to while-in-use restrictions. For this reason, you cannot create a health foreground service that uses body sensors while your app is in the background unless you've been granted the BODY_SENSORS_BACKGROUND (API level 33 to 35) or READ_HEALTH_DATA_IN_BACKGROUND (API level 36 and higher) permissions. For more information, see Restrictions on starting foreground services that need while-in-use permissions.

Description

Any long-running use cases to support apps in the fitness category such as exercise trackers.

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

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

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

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

Nota: El permiso de tiempo de ejecución RECORD_AUDIO está sujeto a restricciones durante el uso. Por este motivo, no puedes crear un servicio en primer plano microphone mientras tu 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 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 para declarar en tu manifiesto
FOREGROUND_SERVICE_PHONE_CALL
Constante para pasar a startForeground()
FOREGROUND_SERVICE_TYPE_PHONE_CALL
Requisitos previos del entorno 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 ROLE_DIALER.
Descripción

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

Alternativas

Si necesitas hacer llamadas telefónicas, por 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

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

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

Reserved for system applications and specific system integrations, to continue to use foreground services.

To use this type, an app must meet at least one of the following criteria:

  • Device is in demo mode state
  • App is a Device Owner
  • App is a Profiler Owner
  • Safety Apps that have the ROLE_EMERGENCY role
  • Device Admin apps
  • Apps holding SCHEDULE_EXACT_ALARM or USE_EXACT_ALARM permission and are using Foreground Service to continue alarms in the background, including haptics-only alarms.
  • VPN apps (configured using Settings > Network & Internet > VPN)

    Otherwise, declaring this type causes the system to throw a ForegroundServiceTypeNotAllowedException.

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.