Tempo limite de serviços em primeiro plano

Se um app for destinado ao Android 15 ou versões mais recentes, o sistema vai restringir por quanto tempo determinados serviços em primeiro plano podem ser executados enquanto o app está em segundo plano. No momento, essa restrição se aplica apenas aos serviços em primeiro plano do tipo dataSync e mediaProcessing. Há limites mais restritivos no shortService tipo de serviço em primeiro plano, que são discutidos na documentação desse tipo de serviço.

Comportamento de tempo limite

O sistema permite que os serviços em primeiro plano dataSync e mediaProcessing sejam executados por um total de 6 horas em um período de 24 horas. Depois disso, o sistema chama o método Service.onTimeout(int, int) do serviço em execução (introduzido no Android 15). O tipo de serviço em primeiro plano mediaProcessing foi adicionado no Android 15. O limite de seis horas é monitorado separadamente para os serviços dataSync e mediaProcessing. Por exemplo, se um serviço dataSync acabou de ser executado por uma hora, o app terá apenas cinco horas disponíveis para serviços em primeiro plano dataSync, mas terá seis horas completas disponíveis para serviços mediaProcessing.

Quando um serviço em primeiro plano atinge o limite de seis horas, ele tem alguns segundos para chamar Service.stopSelf(). Quando o sistema chama Service.onTimeout(), o serviço não é mais considerado um serviço em primeiro plano. Se o serviço não chamar Service.stopSelf(), o sistema vai gerar uma exceção interna. A exceção é registrada no Logcat com a seguinte mensagem:

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

Para evitar problemas com essa mudança de comportamento, faça uma ou mais das seguintes ações:

  1. Faça com que seu serviço implemente o novo método Service.onTimeout(int, int). Quando o app receber o callback, chame stopSelf() em alguns segundos. Se você não parar o app imediatamente, o sistema vai gerar uma falha.
  2. Verifique se os serviços dataSync e mediaProcessing do app não são executados por mais de um total de 6 horas em qualquer período de 24 horas, a menos que o usuário interaja com o app, redefinindo o timer.
  3. Inicie serviços em primeiro plano dataSync ou mediaProcessing apenas como resultado de interação direta do usuário. Como o app está em primeiro plano quando o serviço é iniciado, ele tem as seis horas completas depois que o app vai para segundo plano.
  4. Em vez de usar esses serviços em primeiro plano, use uma API alternativa, como o WorkManager. Em vez de usar um serviço em primeiro plano dataSync, considere usar uma API alternativa.

Se os serviços em primeiro plano dataSync do app tiverem sido executados por 6 horas nas últimas 24, não será possível iniciar outro serviço em primeiro plano dataSync a menos que o usuário tenha trazido o app para o primeiro plano (o que redefine o timer). Se você tentar iniciar outro serviço em primeiro plano dataSync, o sistema vai gerar ForegroundServiceStartNotAllowedException com uma mensagem de erro como "O limite de tempo já foi excedido para o serviço em primeiro plano do tipo dataSync".

Teste

Para testar o comportamento do app, é possível ativar os tempos limite de sincronização de dados mesmo que ele não seja destinado ao Android 15 (desde que esteja sendo executado em um dispositivo Android 15). Para ativar os tempos limite, execute o seguinte comando adb:

adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name

Você também pode ajustar o período de tempo limite para facilitar o teste do comportamento do app quando o limite é atingido. Para definir um novo período de tempo limite para serviços em primeiro plano dataSync, execute o seguinte comando adb:

adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds

Para definir um novo período de tempo limite para serviços em primeiro plano do mediaProcessing, execute este comando:

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds