Tempo limite de serviços em primeiro plano

Se um app for destinado ao Android 15 ou versões mais recentes, o sistema vai colocar restrições sobre o tempo de execução de determinados serviços em primeiro plano enquanto o app estiver em segundo plano. No momento, essa restrição se aplica apenas aos serviços em primeiro plano dataSync e mediaProcessing. Há limites mais restritivos no tipo de serviço em primeiro plano shortService, 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 é rastreado separadamente para os serviços dataSync e mediaProcessing. Por exemplo, se um serviço dataSync acabou de ser executado por uma hora, o app só terá 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 o seguinte:

  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 interromper 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, o que redefine o timer.
  3. Inicie os serviços em primeiro plano dataSync ou mediaProcessing apenas como resultado da 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 entra em 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 seu app tiverem sido executados por 6 horas nas últimas 24 horas, não será possível iniciar outro serviço em primeiro plano dataSync, a menos que o usuário tenha colocado o app em 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 esgotado para o tipo de serviço em primeiro plano dataSync".

Teste

Para testar o comportamento do app, ative os tempos limite de sincronização de dados, mesmo que o app não seja destinado ao Android 15, desde que ele esteja sendo executado em um dispositivo com essa versão. Para ativar os tempos limite, execute o seguinte comando adb:

adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name

Também é possível 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 do 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 os serviços em primeiro plano mediaProcessing, execute este comando:

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds