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:
camera
connectedDevice
dataSync
health
location
mediaPlayback
mediaProjection
microphone
phoneCall
remoteMessaging
shortService
specialUse
systemExempted
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
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
- 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 decamera
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
- 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:
Declara mínimo uno de los siguientes permisos en tu manifiesto:
Solicita y obtén al menos uno de los siguientes permisos de tiempo de ejecución:
Llamada a
UsbManager.requestPermission()
- 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 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
- 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:
Declara el permiso
HIGH_SAMPLING_RATE_SENSORS
en tu manifiesto.Solicita y obtén al menos uno de los siguientes permisos de tiempo de ejecución:
BODY_SENSORS
en el nivel de API 35 y versiones anterioresREAD_HEART_RATE
READ_SKIN_TEMPERATURE
READ_OXYGEN_SATURATION
ACTIVITY_RECOGNITION
Nota: Los permisos de tiempo de ejecución de lectura
BODY_SENSORS
y basados en sensores están sujetos a restricciones durante el uso. Por este motivo, no puedes crear un servicio en primer planohealth
que use sensores corporales mientras tu app está en segundo plano, a menos que se te hayan otorgado los permisosBODY_SENSORS_BACKGROUND
(nivel de API 33 a 35) oREAD_HEALTH_DATA_IN_BACKGROUND
(nivel de API 36 y versiones posteriores). Para obtener más información, consulta Restringe el inicio de servicios en primer plano que necesiten permisos durante el uso.- 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
- 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ó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: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 planomicrophone
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 declaró el permiso
MANAGE_OWN_CALLS
en 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
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 callService.stopSelf()
orService.stopForeground()
before the timeout occurs. Otherwise, the newService.onTimeout()
is called, giving apps a brief opportunity to callstopSelf()
orstopForeground()
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 mentionsFOREGROUND_SERVICE_TYPE_SHORT_SERVICE
. For these reasons, it's considered best practice to implement theService.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 theService.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 theFOREGROUND_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 aForegroundServiceStartNotAllowedException
.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 theshortService
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 usarspecialUse
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:
- El dispositivo debe estar en modo de demostración
- La app debe ser del propietario del dispositivo
- La app debe ser del propietario del generador de perfiles.
- Apps de seguridad que tienen la función
ROLE_EMERGENCY
- Apps de administración del dispositivo
- Apps que tienen el permiso
SCHEDULE_EXACT_ALARM
oUSE_EXACT_ALARM
y usan el servicio en primer plano para continuar con las alarmas en segundo plano, incluidas las alarmas solo táctiles Apps de VPN (configuradas con Configuración > Internet y redes > VPN)
De lo contrario, declarar este tipo causa que el sistema arroje una
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.