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:
cameraconnectedDevicedataSynchealthlocationmediaPlaybackmediaProjectionmicrophonephoneCallremoteMessagingshortServicespecialUsesystemExempted
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
CAMERAruntime permissionNote: The
CAMERAruntime permission is subject to while-in-use restrictions. For this reason, you cannot create acameraforeground 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:foregroundServiceTypeconnectedDevice- 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:
Declare at least one of the following permissions in your manifest:
Request and be granted at least one of the following runtime permissions:
- 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:foregroundServiceTypedataSync- 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:foregroundServiceTypehealth- 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:
Declare the
HIGH_SAMPLING_RATE_SENSORSpermission in your manifest.Request and be granted at least one of the following runtime permissions:
BODY_SENSORSon API level 35 and lowerREAD_HEART_RATEREAD_SKIN_TEMPERATUREREAD_OXYGEN_SATURATIONACTIVITY_RECOGNITION
Note: The
BODY_SENSORSand sensor-based READ runtime permissions are subject to while-in-use restrictions. For this reason, you cannot create ahealthforeground service that uses body sensors while your app is in the background unless you've been granted theBODY_SENSORS_BACKGROUND(API level 33 to 35) orREAD_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:foregroundServiceTypelocation- 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
locationmientras la app está en segundo plano, a menos que se te haya otorgado el permiso de tiempo de ejecuciónACCESS_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:foregroundServiceTypemediaPlayback- 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:foregroundServiceTypemediaProjection- 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
MediaProjectionAPIs. 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:foregroundServiceTypemicrophone- 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_AUDIOestá sujeto a restricciones durante el uso. Por este motivo, no puedes crear un servicio en primer planomicrophonemientras 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:foregroundServiceTypephoneCall- 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 declaró el permiso
MANAGE_OWN_CALLSen su archivo de manifiesto.
- La app declaró el permiso
- La app es la app de teléfono predeterminada a través del rol
ROLE_DIALER.
- La app es la app de teléfono predeterminada a través del rol
- 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
CallScreeningServicepara filtrar llamadas.
Mensajería remota
- Tipo de servicio en primer plano que se declarará en el manifiesto en
android:foregroundServiceTyperemoteMessaging- 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:foregroundServiceTypeshortService- 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
shortServicesolo 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
shortServiceen 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 aService.stopSelf()oService.stopForeground()antes de que se agote el tiempo de espera. De lo contrario, se llama al nuevoService.onTimeout(), lo que les brinda a las apps una breve oportunidad para llamar astopSelf()ostopForeground()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 mencionaFOREGROUND_SERVICE_TYPE_SHORT_SERVICE. Por estos motivos, te recomendamos que, como práctica recomendada, implementes la devolución de llamada aService.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 aService.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ámetroFOREGROUND_SERVICE_TYPE_SHORT_SERVICEextiende 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
shortServicey otro tipo de servicio en primer plano, el sistema ignora la declaración del tiposhortService. 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:foregroundServiceTypespecialUse- 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 usarspecialUseel 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:foregroundServiceTypesystemExempted- 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_EMERGENCYrole - Device Admin apps
- Apps holding
SCHEDULE_EXACT_ALARMorUSE_EXACT_ALARMpermission 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.