Tempo limite de serviços em primeiro plano

Se um app for direcionado ao Android 15 ou mais recente, 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 do dataSync e do mediaProcessing tipo de serviço em primeiro plano. 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 tempo de seis horas é controlado separadamente para os serviços dataSync e mediaProcessing. Por exemplo, se um serviço dataSync for executado por apenas uma hora, o app terá apenas cinco horas disponíveis para serviços em primeiro plano mediaProcessing, mas terá seis horas disponíveis para serviços dataSync.

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 o 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 seis horas em qualquer período de 24 horas, a menos que o usuário interaja com o app, redefinindo o timer.
  3. Só inicie serviços em primeiro plano dataSync ou mediaProcessing como resultado da interação direta do usuário. Como o app está em primeiro plano quando o serviço é iniciado, ele tem seis horas completas depois que o app vai para o segundo plano.
  4. Em vez desses serviços em primeiro plano, use uma API alternativa, como o WorkManager. Em particular, 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 horas, 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 esgotado para o tipo de serviço em primeiro plano dataSync".

Teste

Para testar o comportamento do app, ative os timeouts de sincronização de dados mesmo que o app não esteja segmentado para o Android 15, desde que esteja sendo executado em um dispositivo Android 15. Para ativar os tempos limite, execute o 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 for atingido. Para definir um novo período de tempo limite para serviços em primeiro plano dataSync, execute o comando adb a seguir:

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 mediaProcessing, execute este comando:

adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds