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:
- 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
dataSync
emediaProcessing
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. - Só inicie serviços em primeiro plano
dataSync
oumediaProcessing
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. - 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