Le app che hanno come target Android 12 (livello API 31) o versioni successive non possono avviare servizi in primo piano
mentre l'app è in esecuzione in background, ad eccezione di alcuni casi
speciali. Se un'app tenta di avviare un
servizio in primo piano mentre è in esecuzione in background e il servizio in primo piano
non rientra in uno dei casi eccezionali, il sistema genera un
ForegroundServiceStartNotAllowedException.
Inoltre, se un'app vuole avviare un servizio in primo piano che richiede autorizzazioni durante l'uso (ad esempio, autorizzazioni per sensori corporei, fotocamera, microfono o posizione), non può creare il servizio mentre l'app è in background, anche se rientra in una delle esenzioni dalle limitazioni di avvio in background. Il motivo è spiegato nella sezione Limitazioni all'avvio di servizi in primo piano che richiedono autorizzazioni durante l'uso.
Esenzioni dalle limitazioni di avvio in background
Nelle seguenti situazioni, l'app può avviare servizi in primo piano anche mentre è in esecuzione in background:
- L'app passa da uno stato visibile all'utente, ad esempio un' attività.
- L'app può avviare un'attività in background, ad eccezione del caso in cui l'app abbia un'attività nello stack indietro di un'attività esistente.
L'app riceve un messaggio con priorità elevata utilizzando Firebase Cloud Messaging.
L'utente esegue un'azione su un elemento dell'interfaccia utente correlato alla tua app. Ad esempio, potrebbe interagire con una bolla, notifica, widget, o un'attività.
L'app richiama una sveglia esatta per completare un'azione richiesta dall'utente.
L'app riceve un evento correlato a geofencing o transizione del riconoscimento dell'attività.
Dopo il riavvio del dispositivo e la ricezione dell'azione intent
ACTION_BOOT_COMPLETED,ACTION_LOCKED_BOOT_COMPLETED, oACTION_MY_PACKAGE_REPLACEDin un broadcast receiver.L'app riceve l'azione intent
ACTION_TIMEZONE_CHANGED,ACTION_TIME_CHANGED, oACTION_LOCALE_CHANGEDin un broadcast receiver.L'app riceve l'
ACTION_TRANSACTION_DETECTEDevento daNfcService.App con determinati ruoli o autorizzazioni di sistema, come proprietari del dispositivo e proprietari del profilo.
L'app utilizza Gestione dispositivi associati e dichiara l'autorizzazione
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUNDo l'autorizzazioneREQUEST_COMPANION_RUN_IN_BACKGROUND. Quando possibile, utilizzaREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND.L'utente disattiva le ottimizzazioni della batteria per la tua app.
L'app ha l'
SYSTEM_ALERT_WINDOWautorizzazione. Nota: se la tua app ha come target Android 15 o versioni successive, deve avere l'autorizzazioneSYSTEM_ALERT_WINDOWe deve avere attualmente una finestra di overlay visibile.
Limitazioni all'avvio di servizi in primo piano che richiedono autorizzazioni durante l'uso
Su Android 14 (livello API 34) o versioni successive, esistono situazioni speciali di cui devi tenere conto se avvii un servizio in primo piano che richiede autorizzazioni durante l'uso.
Se la tua app ha come target Android 14 o versioni successive, il sistema operativo verifica quando crei un servizio in primo piano per assicurarsi che l'app disponga di tutte le autorizzazioni appropriate per quel tipo di servizio. Ad esempio, quando crei un
servizio in primo piano di tipo
microfono, il sistema
operativo verifica che la tua app disponga attualmente dell'
RECORD_AUDIO
autorizzazione. Se non hai questa autorizzazione, il sistema genera un'eccezione
SecurityException.
Per le autorizzazioni durante l'uso, questo causa un potenziale problema. Se la tua app ha un
autorizzazione durante l'uso, la ha solo mentre è in
primo piano. Ciò significa che se la tua app è in background e tenta di creare un servizio in primo piano di tipo fotocamera, posizione o microfono, il sistema rileva che l'app non dispone attualmente delle autorizzazioni richieste e genera un'eccezione SecurityException.
Allo stesso modo, se la tua app è in background e crea un servizio sanitario che richiede l'autorizzazione BODY_SENSORS, l'app non dispone attualmente di questa autorizzazione e il sistema genera un'eccezione.
(Questo non si applica se si tratta di un servizio sanitario che richiede autorizzazioni diverse,
come ACTIVITY_RECOGNITION.) La chiamata a
PermissionChecker.checkSelfPermission()
non impedisce questo problema. Se la tua app ha un'autorizzazione durante l'uso e chiama checkSelfPermission() per verificare se la ha, il metodo restituisce PERMISSION_GRANTED anche se l'app è in background. Quando il metodo restituisce PERMISSION_GRANTED, significa che "la tua app ha questa autorizzazione mentre è in uso".
Per questo motivo, se il tuo servizio in primo piano richiede un'autorizzazione durante l'uso, devi chiamare Context.startForegroundService() o Context.bindService() mentre la tua app ha un'attività visibile, a meno che il servizio non rientri in una delle esenzioni definite.
Esenzioni dalle limitazioni alle autorizzazioni durante l'uso
In alcune situazioni, anche se un servizio in primo piano viene avviato mentre l'app è in esecuzione in background, può comunque accedere alle informazioni su posizione, fotocamera e microfono mentre l'app è in esecuzione in primo piano ("durante l'uso").
Nelle stesse situazioni, se il servizio dichiara un tipo di servizio in primo piano
di location e viene avviato da un'app che
dispone dell'autorizzazione ACCESS_BACKGROUND_LOCATION, questo servizio può accedere alle informazioni sulla posizione in qualsiasi momento, anche quando
l'app è in esecuzione in background.
Il seguente elenco contiene queste situazioni:
- Un componente di sistema avvia il servizio.
- Il servizio viene avviato interagendo con widget dell'app.
- Il servizio viene avviato interagendo con una notifica.
- Il servizio viene avviato come un
PendingIntentinviato da un' altra app visibile. - Il servizio viene avviato da un'app che è un controller dei criteri dei dispositivi in esecuzione in modalità device owner.
- Il servizio viene avviato da un'app che fornisce
VoiceInteractionService. - Il servizio viene avviato da un'app che dispone dell'autorizzazione privilegiata
START_ACTIVITIES_FROM_BACKGROUND.
Determinare quali servizi sono interessati nella tua app
Quando testi l'app, avvia i relativi servizi in primo piano. Se un servizio avviato ha accesso limitato a posizione, microfono e fotocamera, in Logcat viene visualizzato il seguente messaggio:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME