Se un'app ha come target Android 15 o versioni successive, il sistema impone
limitazioni alla durata di esecuzione di determinati servizi in primo piano mentre
l'app è in background. Al momento, questa limitazione si applica solo a
dataSync e
mediaProcessing di tipo in primo piano
servizi. Esistono limiti più restrittivi per il tipo di servizio in primo piano shortServiceforeground
service type, descritti nella documentazione di questo tipo di servizio's.
Comportamento di timeout
Il sistema consente ai servizi in primo piano dataSync e mediaProcessing di essere eseguiti
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 dataSync e per i servizi mediaProcessing. Ad
esempio, se un servizio dataSync è stato eseguito per un'ora, l'app avrà a disposizione solo
cinque ore per i servizi in primo piano dataSync, ma avrà
a disposizione sei ore complete per i servizi mediaProcessing.
Quando un servizio in primo piano raggiunge il limite di sei ore, ha a disposizione 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 procedere in uno o più dei seguenti modi:
- Fai in modo che il servizio implementi il nuovo metodo
Service.onTimeout(int, int). Quando l'app riceve il callback, assicurati di chiamarestopSelf()entro a pochi secondi. (Se non arresti immediatamente l'app, il sistema genera un errore.) - Assicurati che i servizi
dataSyncemediaProcessingdella tua app non vengano eseguiti per più di 6 ore in totale 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
dataSyncomediaProcessingsolo in seguito all'interazione diretta dell'utente. Poiché l'app è in primo piano all'avvio del servizio, quest'ultimo ha a disposizione le sei ore complete dopo che l'app passa in background. - Anziché utilizzare questi servizi in primo piano, utilizza un'API
alternativa, come WorkManager. In particolare, anziché utilizzare un
dataSyncservizio in primo piano, valuta la possibilità di utilizzare un API alternativa.
Se i servizi in primo piano dataSync della tua app sono stati eseguiti per 6 ore nelle ultime
24 ore, non puoi avviare un altro servizio in primo piano dataSync a meno che l'utente
non abbia portato l'app in primo piano (in questo caso il timer viene reimpostato). Se provi ad
avviare un altro servizio in primo piano dataSync, il sistema genera
ForegroundServiceStartNotAllowedException
con un messaggio di errore simile a "Time limit already exhausted for foreground service
type dataSync".
Test
Per testare il comportamento della tua app, puoi abilitare i timeout di sincronizzazione dei dati anche se l'app
non ha come target Android 15 (a condizione che sia in esecuzione su un dispositivo Android 15
device). Per abilitare i timeout, esegui il seguente adb comando:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
Puoi anche modificare il periodo di timeout per semplificare il test del comportamento della tua
app quando viene raggiunto il limite. Per impostare un nuovo periodo di timeout per
dataSync servizi in primo piano, esegui il seguente adb comando:
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