Se um app for destinado ao Android 15 ou versões mais recentes, o sistema vai restringir por quanto tempo determinados serviços em primeiro plano podem ser executados enquanto o app está em segundo plano. No momento, essa restrição se aplica apenas aos serviços em primeiro plano do tipo
dataSync
e
mediaProcessing
. Há limites mais restritivos no shortService
tipo de serviço em primeiro
plano, 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 é monitorado separadamente para os serviços dataSync
e mediaProcessing
. Por exemplo, se um serviço dataSync
acabou de ser executado por uma hora, o app terá apenas 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 uma ou mais das seguintes ações:
- 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 parar 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 6 horas em qualquer período de 24 horas, a menos que o usuário interaja com o app, redefinindo o timer. - Inicie serviços em primeiro plano
dataSync
oumediaProcessing
apenas como resultado de 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 vai para 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 app tiverem sido executados por 6 horas nas últimas
24, 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 excedido para o serviço em primeiro plano
do tipo dataSync".
Teste
Para testar o comportamento do app, é possível ativar os tempos limite de sincronização de dados mesmo que ele
não seja destinado ao Android 15 (desde que esteja sendo executado em um dispositivo
Android 15). Para ativar os tempos limite, execute o seguinte 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 é 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 do mediaProcessing
, execute este
comando:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds