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 soddisfa uno dei casi eccezionali, il sistema genera un errore ForegroundServiceStartNotAllowedException
.
Inoltre, se un'app vuole avviare un servizio in primo piano che richiede autorizzazioni durante l'uso (ad esempio, autorizzazioni per sensore corporeo, fotocamera, microfono o posizione), non può creare il servizio mentre l'app è in background, anche se l'app rientra in una delle esenzioni dalle limitazioni all'avvio in background. Il motivo è spiegato nella sezione Limitazioni all'avvio di servizi in primo piano che richiedono autorizzazioni di utilizzo.
Esenzioni dalle limitazioni relative all'avvio in background
Nelle seguenti situazioni, la tua app può avviare servizi in primo piano anche mentre è in esecuzione in background:
- La tua app passa da uno stato visibile all'utente, ad esempio un'attività.
- La tua app può avviare un'attività in background, tranne nel caso in cui l'app abbia un'attività nello stack precedente di un'attività esistente.
La tua app riceve un messaggio a 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, una notifica, un widget o un'attività.
La tua app richiama una sveglia esatta per completare un'azione richiesta dall'utente.
La tua app è l'attuale metodo di input del dispositivo.
La tua app riceve un evento correlato alla georeferenziazione o alla 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_REPLACED
in un ricevitore di trasmissione.La tua app riceve l'intent
ACTION_TIMEZONE_CHANGED
,ACTION_TIME_CHANGED
, oACTION_LOCALE_CHANGED
in un broadcast receiver.La tua app riceve l'evento
ACTION_TRANSACTION_DETECTED
daNfcService
.App con determinati ruoli o autorizzazioni di sistema, ad esempio proprietari del dispositivo e proprietari del profilo.
La tua app utilizza Companion Device Manager e dichiara l'autorizzazione
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
o l'autorizzazioneREQUEST_COMPANION_RUN_IN_BACKGROUND
. Se possibile, utilizzaREQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
.L'utente disattiva le ottimizzazioni della batteria per la tua app.
La tua app dispone dell'autorizzazione
SYSTEM_ALERT_WINDOW
. Nota: se la tua app ha come target Android 15 o versioni successive, deve disporre dell'autorizzazioneSYSTEM_ALERT_WINDOW
e 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 essere a conoscenza se avvii un servizio in primo piano che richiede autorizzazioni di accesso 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 la tua 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'autorizzazione
RECORD_AUDIO
. Se non disponi di questa autorizzazione, il sistema genera un
SecurityException
.
Per le autorizzazioni durante l'uso, questo causa un potenziale problema. Se la tua app ha un'autorizzazione
durante l'uso, questa autorizzazione è valida solo quando l'app è 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 la tua app attualmente non dispone delle autorizzazioni richieste e genera un
SecurityException
.
Allo stesso modo, se la tua app è in background e crea un
servizio sanitario che richiede l'autorizzazione BODY_SENSORS
, l'app
attualmente non dispone di questa autorizzazione e il sistema genera un'eccezione.
Ciò 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 dispone di un'autorizzazione durante l'uso e
chiama checkSelfPermission()
per verificare se dispone di questa autorizzazione, il metodo
restituisce PERMISSION_GRANTED
anche se l'app è in background. Quando il
metodo restituisce PERMISSION_GRANTED
, significa che "la tua app dispone di questa autorizzazione
mentre l'app è in uso".
Per questo motivo, se il tuo servizio in primo piano richiede un'autorizzazione di accesso 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 relative alle autorizzazioni durante l'utilizzo
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").
In queste 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 viene eseguita in background.
Il seguente elenco contiene queste situazioni:
- Un componente di sistema avvia il servizio.
- Il servizio inizia interagendo con i widget delle app.
- Il servizio inizia interagendo con una notifica.
- Il servizio inizia come
PendingIntent
inviato da un'app diversa e visibile. - Il servizio viene avviato da un'app che è un controller dei criteri dei dispositivi in esecuzione in modalità Proprietario del dispositivo.
- Il servizio viene avviato da un'app che fornisce il
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 la tua 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