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:
- Faça com que seu 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 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. - Inicie os serviços em primeiro plano
dataSyncoumediaProcessingapenas 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. - 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