Se um app for destinado ao Android 15 ou versões mais recentes, o sistema vai restringir 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 a
dataSync e
mediaProcessing do tipo de serviço em primeiro plano em primeiro plano
serviços. 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 seis 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 é rastreado separadamente para serviços dataSync e mediaProcessing. Por exemplo, se um serviço dataSync acabou de ser executado por uma hora, o app só teria cinco horas disponíveis para serviços em primeiro plano dataSync, mas teria 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:
- Faça com que o serviço implemente o novo método
Service.onTimeout(int, int). Quando o app receber o callback, chamestopSelf()em alguns segundos. Se você não interromper o app imediatamente, o sistema vai gerar uma falha. - Verifique se os serviços
dataSyncemediaProcessingdo app não são executados por mais de seis horas no total em qualquer período de 24 horas, a menos que o usuário interaja com o app, redefinindo o timer. - Só inicie serviços em primeiro plano
dataSyncoumediaProcessingcomo 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. - Em vez de usar esses serviços em primeiro plano, use uma API
alternativa, como a WorkManager. Em particular, em vez de usar um
dataSyncserviço em primeiro plano, considere usar uma API alternativa.
Se os serviços em primeiro plano dataSync do app foram executados por seis horas nas últimas
24 horas, não é possível iniciar outro serviço em primeiro plano dataSync, a menos que o usuário
tenha levado 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, é possível ativar 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 Android 15). Para ativar os tempos limite, execute o seguinte adb comando:
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 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 mediaProcessing, execute este comando:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds