Tipi di servizi in primo piano

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:

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:

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:

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 chiamare Service.stopSelf(). Se il servizio non chiama Service.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 è l'app di connessione a internet predefinita tramite il ruolo ROLE_DIALER.
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 chiamare Service.stopSelf() o Service.stopForeground() prima che si verifichi il timeout. In caso contrario, viene chiamato il nuovo Service.onTimeout(), offrendo alle app una breve opportunità di chiamare stopSelf() o stopForeground() 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 menziona FOREGROUND_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 il Service.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 parametro FOREGROUND_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 un ForegroundServiceStartNotAllowedException.

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 tipo shortService. 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 tipo specialUse.

<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:

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.