Se um app for direcionado ao Android 15 ou versões mais recentes, o sistema vai impor
restrições sobre por quanto tempo determinados serviços em primeiro plano podem ser executados enquanto
o app estiver em segundo plano. No momento, essa restrição se aplica apenas a
dataSync
e
serviços em primeiro plano do tipo 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 tempo de seis horas é
rastreado separadamente para serviços dataSync
e mediaProcessing
. Por exemplo, se um serviço dataSync
fosse executado por apenas uma hora, o app teria apenas cinco horas disponíveis para os serviços em primeiro plano mediaProcessing
, mas teria seis horas completas disponíveis para os serviços do 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 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 de usar esses 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, é possível ativar tempos limite de sincronização de dados mesmo que o app
não seja destinado ao Android 15, desde que esteja em execução 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 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