Tiempos de espera del servicio en primer plano

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

Comportamiento del 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 del cual el sistema llama al método Service.onTimeout(int, int) del servicio en ejecución (presentado en Android 15). (El tipo de servicio en primer plano mediaProcessing se agregó en Android 15). Se hace un seguimiento del límite de tiempo de seis horas por separado para dataSync y para los servicios de mediaProcessing. Por ejemplo, si un servicio dataSync solo se ejecutó durante una hora, la app solo tendría cinco horas disponibles para los servicios en primer plano de mediaProcessing, pero tendría seis horas completas disponibles para los servicios de dataSync.

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 pocos segundos. (Si no detienes la app de inmediato, el sistema genera una falla).
  2. Asegúrate de que los servicios dataSync y mediaProcessing de tu app no se ejecuten durante más de un total de 6 horas en cualquier período de 24 horas (a menos que el usuario interactúe con la app y restablezca el temporizador).
  3. Inicia solo servicios en primer plano de 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 de 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 puedes 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 una ForegroundServiceStartNotAllowedException con un mensaje de error como "Time limit already exhausted for foreground service type 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 que la app 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 tiempo de espera para facilitar la prueba del comportamiento de tu app cuando se alcanza el límite. Para establecer un nuevo tiempo de espera para los servicios en primer plano de dataSync, ejecuta el siguiente comando de 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