Tiempos de espera del servicio en primer plano

Si una app se segmenta para Android 15 o versiones posteriores, el sistema impone restricciones sobre el tiempo que se permite que se ejecuten ciertos servicios en primer plano mientras la app está en segundo plano. Actualmente, esta restricción solo se aplica a los servicios en primer plano de tipo dataSync y mediaProcessing. Existen límites más restrictivos en el tipo de servicio en primer plano shortService, que se analizan en la documentación de ese tipo de servicio.

Comportamiento de tiempo de espera

El sistema permite que los servicios en primer plano dataSync y mediaProcessing se ejecuten durante un total de 6 horas en un período de 24 horas, después de lo cual el sistema llama al método Service.onTimeout(int, int) del servicio en ejecución (introducido en Android 15). (El tipo de servicio en primer plano mediaProcessing se agregó en Android 15). El límite de seis horas se registra por separado para los servicios de dataSync y mediaProcessing. Por ejemplo, si un servicio dataSync se ejecutó durante una hora, la app solo tendría cinco horas disponibles para los servicios en primer plano dataSync, pero tendría seis horas completas disponibles para los servicios mediaProcessing.

Cuando un servicio en primer plano alcanza el límite de seis horas, tiene unos segundos para llamar a Service.stopSelf(). Cuando el sistema llama a Service.onTimeout(), el servicio ya no se considera un servicio en primer plano. Si el servicio no llama a Service.stopSelf(), el sistema arroja una excepción interna. La excepción se registra en Logcat con el siguiente mensaje:

Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"

Para evitar problemas con este cambio de comportamiento, puedes realizar una o más de las siguientes acciones:

  1. Haz que tu servicio implemente el nuevo método Service.onTimeout(int, int). Cuando tu app reciba la devolución de llamada, asegúrate de llamar a stopSelf() en unos segundos. (Si no detienes la app de inmediato, el sistema generará un error).
  2. Asegúrate de que los servicios dataSync y mediaProcessing de tu app no se ejecuten durante más de 6 horas en total en un período de 24 horas (a menos que el usuario interactúe con la app, lo que restablecerá el temporizador).
  3. Solo inicia servicios en primer plano dataSync o mediaProcessing como resultado de la interacción directa del usuario. Como tu app está en primer plano cuando se inicia el servicio, este tiene las seis horas completas después de que la app pasa a segundo plano.
  4. En lugar de usar estos servicios en primer plano, usa una API alternativa, como WorkManager. En particular, en lugar de usar un servicio en primer plano dataSync, considera usar una API alternativa.

Si los servicios en primer plano dataSync de tu app se ejecutaron durante 6 horas en las últimas 24, no podrás iniciar otro servicio en primer plano dataSync a menos que el usuario haya llevado tu app al primer plano (lo que restablece el temporizador). Si intentas iniciar otro servicio en primer plano de dataSync, el sistema arroja ForegroundServiceStartNotAllowedException con un mensaje de error como "Ya se agotó el límite de tiempo para el servicio en primer plano de tipo dataSync".

Prueba

Para probar el comportamiento de tu app, puedes habilitar los tiempos de espera de sincronización de datos incluso si tu app no se orienta a Android 15 (siempre y cuando se ejecute en un dispositivo Android 15). Para habilitar los tiempos de espera, ejecuta el siguiente comando adb:

adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name

También puedes ajustar el período de espera para probar con mayor facilidad cómo se comporta tu app cuando se alcanza el límite. Para establecer un nuevo período de tiempo de espera para los servicios en primer plano de dataSync, ejecuta el siguiente comando adb:

adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds

Para establecer un nuevo período de tiempo de espera para los servicios en primer plano de mediaProcessing, ejecuta este comando:

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds