A partire da Android 14 (livello API 34), devi dichiarare un tipo di servizio appropriato per ogni servizio in primo piano. Ciò significa che devi dichiarare il tipo di servizio nel manifest dell'app e richiedere anche l'autorizzazione per il servizio in primo piano appropriata per quel tipo (oltre a richiedere l'autorizzazione FOREGROUND_SERVICE
). Inoltre, a seconda del tipo di servizio in primo piano, potresti
dover richiedere le autorizzazioni di runtime prima di avviare il servizio.
Fotocamera
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
camera
- Autorizzazione da dichiarare nel manifest
FOREGROUND_SERVICE_CAMERA
- Costante da passare a
startForeground()
FOREGROUND_SERVICE_TYPE_CAMERA
- Prerequisiti di runtime
Richiedere e ottenere l'autorizzazione di runtime
CAMERA
- Descrizione
Continua per accedere alla fotocamera dallo sfondo, ad esempio le app di video chat che consentono il multitasking.
Dispositivo connesso
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
connectedDevice
- Autorizzazione da dichiarare nel file manifest
FOREGROUND_SERVICE_CONNECTED_DEVICE
- Costante da passare a
startForeground()
FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE
- Prerequisiti di runtime
Deve essere vera almeno una delle seguenti condizioni:
Dichiara almeno una delle seguenti autorizzazioni nel file manifest:
Richiedi e ottieni almeno una delle seguenti autorizzazioni di runtime:
- Descrizione
Interazioni con dispositivi esterni che richiedono Bluetooth, NFC, IR, USB o una connessione di rete.
- Alternative
Se la tua app deve eseguire il trasferimento continuo di dati su un dispositivo esterno, puoi utilizzare il gestore dei dispositivi complementari. Utilizza l'API di presenza del dispositivo complementare per consentire alla tua app di continuare a funzionare mentre il dispositivo complementare è in portata.
Se la tua app deve cercare dispositivi Bluetooth, ti consigliamo di utilizzare l'API di ricerca Bluetooth.
Sincronizzazione dati
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
dataSync
- Autorizzazione da dichiarare nel manifest
FOREGROUND_SERVICE_DATA_SYNC
- Costante da passare a
startForeground()
FOREGROUND_SERVICE_TYPE_DATA_SYNC
- Prerequisiti di runtime
- Nessuno
- Descrizione
Operazioni di trasferimento dei dati, ad esempio:
- Caricamento o download dei dati
- Operazioni di backup e ripristino
- Operazioni di importazione o esportazione
- Recupera dati
- Elaborazione dei file locali
- Trasferire dati tra un dispositivo e il cloud tramite una rete
- Alternative
Per informazioni dettagliate, vedi Alternative ai servizi di sincronizzazione dei dati in primo piano.
Salute
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
health
- Autorizzazione da dichiarare nel file manifest
FOREGROUND_SERVICE_HEALTH
- Costante da passare a
startForeground()
FOREGROUND_SERVICE_TYPE_HEALTH
- Prerequisiti di runtime
Deve essere vera almeno una delle seguenti condizioni:
Dichiara l'autorizzazione
HIGH_SAMPLING_RATE_SENSORS
nel file manifest.Richiedi e ottieni almeno una delle seguenti autorizzazioni di runtime:
BODY_SENSORS
sull'API 35 e versioni precedentiREAD_HEART_RATE
READ_SKIN_TEMPERATURE
READ_OXYGEN_SATURATION
ACTIVITY_RECOGNITION
- Descrizione
Eventuali casi d'uso di lunga durata per supportare le app nella categoria fitness, come i tracker per l'esercizio fisico.
Posizione
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
location
- Autorizzazione da dichiarare nel file manifest
FOREGROUND_SERVICE_LOCATION
- Costante da passare a
startForeground()
FOREGROUND_SERVICE_TYPE_LOCATION
- Prerequisiti di runtime
L'utente deve aver attivato i servizi di geolocalizzazione e all'app deve essere stata concessa almeno una delle seguenti autorizzazioni di runtime:
- Descrizione
Casi d'uso di lunga durata che richiedono l'accesso alla posizione, come la navigazione e la condivisione della posizione.
- Alternative
Se la tua app deve essere attivata quando l'utente raggiunge posizioni specifiche, consigliamo di utilizzare l'API geofence.
Contenuti multimediali
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
mediaPlayback
- Autorizzazione da dichiarare nel manifest
FOREGROUND_SERVICE_MEDIA_PLAYBACK
- Costante da passare a
startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
- Prerequisiti di runtime
- Nessuno
- Descrizione
Continua la riproduzione audio o video in background. Supporta la funzionalità di registrazione video digitale (DVR) su Android TV.
- Alternative
Se mostri un video in modalità picture in picture, utilizza la modalità Picture in picture.
Elaborazione contenuti multimediali in corso
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
mediaProcessing
- Autorizzazione da dichiarare nel file manifest
FOREGROUND_SERVICE_MEDIA_PROCESSING
- Costante da passare a
startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PROCESSING
- Prerequisiti di runtime
- Nessuna
- Descrizione
Servizio per eseguire operazioni che richiedono molto tempo sugli asset multimediali, come la conversione dei contenuti multimediali in diversi formati. Il sistema consente a questo servizio un tempo di esecuzione limitato. In circostanze normali, questo limite di tempo è di 6 ore su 24. Questo limite è condiviso da tutti i
mediaProcessing
servizi in primo piano di un'app.L'app deve interrompere manualmente il servizio di elaborazione dei contenuti multimediali nel seguente scenario:
- Quando l'operazione di transcodifica termina o raggiunge uno stato di errore, chiedi al servizio di chiamare
Service.stopForeground()
eService.stopSelf()
per interromperlo completamente.
- Quando l'operazione di transcodifica termina o raggiunge uno stato di errore, chiedi al servizio di chiamare
Se viene raggiunto il periodo di timeout, il sistema chiama il metodo
Service.onTimeout(int, int)
del servizio. A questo momento, il servizio ha alcuni secondi per chiamareService.stopSelf()
. Se il servizio non chiamaService.stopSelf()
, si verificherà un ANR con il seguente messaggio di errore: "Un servizio in primo piano di <fgs_type> non si è interrotto entro il suo timeout: <component_name>".Nota:
Service.onTimeout(int, int)
non è disponibile su Android 14 o versioni precedenti. Sui dispositivi che eseguono queste versioni, se un servizio di elaborazione dei contenuti multimediali raggiunge il periodo di timeout, il sistema memorizza immediatamente l'app nella cache. Per questo motivo, l'app non deve attendere di ricevere una notifica di timeout. Dovrebbe invece terminare il servizio in primo piano o cambiarlo in un servizio in background, se opportuno.
Proiezione di contenuti multimediali
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
mediaProjection
- Autorizzazione da dichiarare nel manifest
FOREGROUND_SERVICE_MEDIA_PROJECTION
- Costante da passare a
startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
- Prerequisiti di runtime
Chiama il metodo
createScreenCaptureIntent()
prima di avviare il servizio in primo piano. In questo modo, l'utente visualizza una notifica relativa all'autorizzazione; l'utente deve concedere l'autorizzazione prima che tu possa creare il servizio.Dopo aver creato il servizio in primo piano, puoi chiamare
MediaProjectionManager.getMediaProjection()
.- Descrizione
Proietta i contenuti su dispositivi esterni o non principali utilizzando le API
MediaProjection
. Questi contenuti non devono essere esclusivamente contenuti multimediali.- Alternative
Per riprodurre in streaming contenuti multimediali su un altro dispositivo, utilizza l'SDK Google Cast.
Microfono
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
microphone
- Autorizzazione da dichiarare nel manifest
FOREGROUND_SERVICE_MICROPHONE
- Costante da passare a
startForeground()
FOREGROUND_SERVICE_TYPE_MICROPHONE
- Prerequisiti di runtime
Richiedi e ottieni l'autorizzazione di runtime
RECORD_AUDIO
.- Descrizione
Continua l'acquisizione del microfono in background, ad esempio per registratori vocali o app di comunicazione.
Telefonata
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
phoneCall
- Autorizzazione da dichiarare nel manifest
FOREGROUND_SERVICE_PHONE_CALL
- Costante da passare a
startForeground()
FOREGROUND_SERVICE_TYPE_PHONE_CALL
- Prerequisiti di runtime
Almeno una di queste condizioni deve essere vera:
- L'app ha dichiarato l'autorizzazione
MANAGE_OWN_CALLS
nel file manifest.
- L'app ha dichiarato l'autorizzazione
- L'app è l'app di connessione a internet predefinita tramite il ruolo
ROLE_DIALER
.
- L'app è l'app di connessione a internet predefinita tramite il ruolo
- Descrizione
Continua una chiamata in corso utilizzando le API
ConnectionService
.- Alternative
Se devi effettuare chiamate telefoniche, videochiamate o chiamate VoIP, valuta la possibilità di utilizzare la libreria
android.telecom
.Valuta la possibilità di utilizzare
CallScreeningService
per filtrare le chiamate.
Messaggistica remota
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
remoteMessaging
- Autorizzazione da dichiarare nel file manifest
FOREGROUND_SERVICE_REMOTE_MESSAGING
- Costante da passare a
startForeground()
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
- Prerequisiti di runtime
- Nessuna
- Descrizione
- Trasferisci i messaggi da un dispositivo all'altro. Assiste con la continuità delle attività di messaggistica di un utente quando cambia dispositivo.
Servizio breve
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
shortService
- Autorizzazione da dichiarare nel file manifest
- Nessuna
- Costante da passare a
startForeground()
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE
- Prerequisiti di runtime
- Nessuna
- Descrizione
Completare rapidamente i lavori critici che non possono essere interrotti o posticipati.
Questo tipo ha alcune caratteristiche uniche:
- Può essere eseguito solo per un breve periodo di tempo (circa 3 minuti).
- Nessun supporto per i servizi in primo piano permanenti.
- Impossibile avviare altri servizi in primo piano.
- Non richiede un'autorizzazione specifica per tipo, ma richiede comunque l'autorizzazione
FOREGROUND_SERVICE
. - Un
shortService
può passare a un altro tipo di servizio solo se l'app è attualmente idonea a avviare un nuovo servizio in primo piano. - Un servizio in primo piano può modificare il proprio tipo in
shortService
in qualsiasi momento, a quel punto inizia il periodo di timeout.
Il timeout per shortService inizia dal momento in cui viene chiamato
Service.startForeground()
. L'app deve chiamareService.stopSelf()
oService.stopForeground()
prima che si verifichi il timeout. In caso contrario, viene chiamato il nuovoService.onTimeout()
, offrendo alle app una breve opportunità di chiamarestopSelf()
ostopForeground()
per interrompere il servizio.Poco dopo la chiamata a
Service.onTimeout()
, l'app entra in uno stato memorizzato nella cache e non è più considerata in primo piano, a meno che l'utente non interagisca attivamente con l'app. Poco dopo che l'app è stata memorizzata nella cache e il servizio non è stato interrotto, l'app riceve un ANR. Il messaggio ANR menzionaFOREGROUND_SERVICE_TYPE_SHORT_SERVICE
. Per questi motivi, è considerata una best practice implementare il callbackService.onTimeout()
.Il richiamata
Service.onTimeout()
non esiste su Android 13 e versioni precedenti. Se lo stesso servizio viene eseguito su questi dispositivi, non riceve un timeout né un ANR. Assicurati che il servizio si fermi non appena completa l'attività di elaborazione, anche se non ha ancora ricevuto ilService.onTimeout()
callback.È importante notare che se il timeout di
shortService
non viene rispettato, l'app genera un ANR anche se sono in esecuzione altri servizi in primo piano validi o altri processi del ciclo di vita dell'app.Se un'app è visibile all'utente o soddisfa una delle esenzioni che consentono l'avvio dei servizi in primo piano dal background, la chiamata
Service.StartForeground()
di nuovo con il parametroFOREGROUND_SERVICE_TYPE_SHORT_SERVICE
prolunga il timeout di altri 3 minuti. Se l'app non è visibile all'utente e non soddisfa una delle esenzioni, qualsiasi tentativo di avviare un altro servizio in primo piano, indipendentemente dal tipo, genera unForegroundServiceStartNotAllowedException
.Se un utente disattiva l'ottimizzazione batteria per la tua app, quest'ultima è comunque interessata dal timeout di shortService FGS.
Se avvii un servizio in primo piano che include il tipo
shortService
e un altro tipo di servizio in primo piano, il sistema ignora la dichiarazione del tiposhortService
. Tuttavia, il servizio deve comunque rispettare i prerequisiti degli altri tipi dichiarati. Per ulteriori informazioni, consulta la documentazione relativa ai servizi in primo piano.
Uso speciale
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
specialUse
- Autorizzazione da dichiarare nel file manifest
FOREGROUND_SERVICE_SPECIAL_USE
- Costante da passare a
startForeground()
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
- Prerequisiti di runtime
- Nessuna
- Descrizione
Copre tutti i casi d'uso validi dei servizi in primo piano non coperti dagli altri tipi di servizi in primo piano.
Oltre a dichiarare il
FOREGROUND_SERVICE_TYPE_SPECIAL_USE
tipo di servizio in primo piano, gli sviluppatori devono dichiarare i casi d'uso nel manifest. A tal fine, specificano l'elemento<property>
all'interno dell'elemento<service>
. Questi valori e i casi d'uso corrispondenti vengono esaminati quando invii l'app in Google Play Console. I casi d'uso che fornisci sono in formato libero e devi assicurarti di fornire informazioni sufficienti per consentire all'esaminatore di capire perché devi utilizzare il tipospecialUse
.<service android:name="fooService" android:foregroundServiceType="specialUse"> <property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" android:value="explanation_for_special_use"/> </service>
Esenzione dal sistema
- Tipo di servizio in primo piano da dichiarare nel file manifest in
android:foregroundServiceType
systemExempted
- Autorizzazione da dichiarare nel manifest
FOREGROUND_SERVICE_SYSTEM_EXEMPTED
- Costante per passare a
startForeground()
FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED
- Prerequisiti di runtime
- Nessuno
- Descrizione
Riservato per applicazioni di sistema e integrazioni di sistema specifiche, per continuare a utilizzare i servizi in primo piano.
Per utilizzare questo tipo, un'app deve soddisfare almeno uno dei seguenti criteri:
- Il dispositivo è in modalità demo
- L'app è un proprietario del dispositivo
- L'app è proprietario di Profiler
- App per la sicurezza con il ruolo
ROLE_EMERGENCY
- App Amministratore dispositivo
- App con autorizzazione
SCHEDULE_EXACT_ALARM
oUSE_EXACT_ALARM
App VPN (configurate con Impostazioni > Rete e internet > VPN)
In caso contrario, la dichiarazione di questo tipo fa sì che il sistema restituisca un elemento
ForegroundServiceTypeNotAllowedException
.
Applicazione delle norme di Google Play per l'utilizzo dei tipi di servizi in primo piano
Se la tua app ha come target Android 14 o versioni successive, devi dichiarare i tipi di servizi in primo piano della tua app nella pagina Contenuti app di Play Console (Norme > Contenuti app). Per ulteriori informazioni su come dichiarare i tipi di servizio in primo piano in Play Console, consulta Informazioni sui requisiti relativi al servizio in primo piano e all'intent a schermo intero.