Se un'app ha come target Android 15 o versioni successive, il sistema impone limitazioni al tempo di esecuzione di determinati servizi in primo piano mentre l'app è in background. Al momento, questa limitazione si applica solo ai servizi in primo piano
dataSync
e
mediaProcessing
tipo di servizio in primo piano. Esistono limiti più restrittivi per il tipo di servizio in primo piano shortService
, descritti nella documentazione relativa a quel tipo di servizio.
Comportamento di timeout
Il sistema consente l'esecuzione dei servizi in primo piano dataSync
e mediaProcessing
per un totale di 6 ore in un periodo di 24 ore, dopodiché chiama il metodo Service.onTimeout(int, int)
del servizio in esecuzione (introdotto in Android 15). Il tipo di servizio in primo piano mediaProcessing
è stato aggiunto in Android 15. Il limite di tempo di sei ore viene monitorato separatamente per i servizi dataSync
e mediaProcessing
. Ad
esempio, se un servizio dataSync
è stato eseguito per un'ora, l'app avrebbe
disponibili solo cinque ore per i servizi in primo piano mediaProcessing
, mentre
avrebbe disponibile altre sei ore
per i servizi dataSync
.
Quando un servizio in primo piano raggiunge il limite di sei ore, ha alcuni secondi per chiamare Service.stopSelf()
. Quando il sistema chiama
Service.onTimeout()
, il servizio non è più considerato un servizio in primo piano.
Se il servizio non chiama Service.stopSelf()
, il sistema genera un'eccezione interna. L'eccezione viene registrata in Logcat con il seguente messaggio:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
Per evitare problemi con questa modifica del comportamento, puoi eseguire una o più delle seguenti operazioni:
- Chiedi al tuo servizio di implementare il nuovo metodo
Service.onTimeout(int, int)
. Quando l'app riceve il Callback, assicurati di chiamarestopSelf()
entro alcuni secondi. Se non interrompi immediatamente l'app, il sistema genera un errore. - Assicurati che i servizi
dataSync
emediaProcessing
della tua app non vengano eseguiti per più di un totale di 6 ore in un periodo di 24 ore (a meno che l'utente non interagisca con l'app, reimpostando il timer). - Avvia i servizi in primo piano
dataSync
omediaProcessing
solo a seguito di un'interazione diretta dell'utente. Poiché la tua app è in primo piano all'avvio del servizio, il servizio ha a disposizione tutte le sei ore dopo che l'app passa in background. - Anziché utilizzare questi servizi in primo piano, utilizza un'API alternativa, come WorkManager. In particolare, invece di utilizzare un servizio in primo piano
dataSync
, valuta la possibilità di utilizzare un'API alternativa.
Se i servizi in primo piano dataSync
della tua app sono stati in esecuzione per 6 ore nelle ultime 24, non puoi avviare un altro servizio in primo piano dataSync
a meno che l'utente non abbia portato la tua app in primo piano (il che reimposta il timer). Se provi a avviare un altro servizio in primo piano dataSync
, il sistema genera un messaggio di errore ForegroundServiceStartNotAllowedException
come "Tempo limite già esaurito per il servizio in primo piano di tipo dataSync".
Test
Per testare il comportamento dell'app, puoi attivare i timeout della sincronizzazione dei dati anche se la tua app non ha come target Android 15 (a condizione che l'app sia in esecuzione su un dispositivo Android 15). Per abilitare i timeout, esegui questo comando adb
:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
Puoi anche modificare il periodo di timeout per testare più facilmente il comportamento
della tua app quando viene raggiunto il limite. Per impostare un nuovo periodo di timeout per i servizi in primo piano dataSync
, esegui questo comando adb
:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
Per impostare un nuovo periodo di timeout per i servizi in primo piano mediaProcessing
, esegui questo
comando:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds