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é il sistema 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 solo per un'ora, l'app avrebbe solo
cinque ore disponibili per i servizi in primo piano dataSync
, ma avrebbe
un totale di
sei ore disponibili per i servizi dataSync
.mediaProcessing
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 dell'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 il passaggio dell'app in background. - Anziché utilizzare questi servizi in primo piano, utilizza un'API alternativa, come WorkManager. In particolare, anziché utilizzare un
dataSync
servizio in primo piano, 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 il seguente 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 dataSync
in primo piano, esegui il seguente 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