I tipi di servizi in primo piano sono obbligatori

To help developers be more intentional with defining user-facing foreground services, Android 10 introduced the android:foregroundServiceType attribute within the <service> element.

If your app targets Android 14, it must specify appropriate foreground service types. As in previous versions of Android, multiple types can be combined. This list shows the foreground service types to choose from:

If a use case in your app isn't associated with any of these types, we strongly recommend that you migrate your logic to use WorkManager or user-initiated data transfer jobs.

The health, remoteMessaging, shortService, specialUse, and systemExempted types are new in Android 14.

The following code snippet provides an example of a foreground service type declaration in the manifest:

<manifest ...>
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
    <application ...>
      <service
          android:name=".MyMediaPlaybackService"
          android:foregroundServiceType="mediaPlayback"
          android:exported="false">
      </service>
    </application>
</manifest>

If an app that targets Android 14 doesn't define types for a given service in the manifest, then the system will raise MissingForegroundServiceTypeException upon calling startForeground() for that service.

Dichiara la nuova autorizzazione per utilizzare i tipi di servizi in primo piano

Se le app destinate ad Android 14 utilizzano un servizio in primo piano, devono dichiarare un'autorizzazione specifica, in base al tipo di servizio in primo piano, introdotta da Android 14. Queste autorizzazioni vengono visualizzate nelle sezioni contrassegnate come "Autorizzazione da dichiarare nel file manifest" nella sezione Casi d'uso previsti e applicazione per ogni tipo di servizio in primo piano di questa pagina.

Tutte le autorizzazioni sono definite autorizzazioni normali e vengono concesse per impostazione predefinita. Gli utenti non possono revocare queste autorizzazioni.

Includi il tipo di servizio in primo piano in fase di esecuzione

La best practice per le applicazioni che avviano i servizi in primo piano consiste nell'utilizzare la versione ServiceCompat di startForeground() (disponibile in androidx-core 1.12 e versioni successive), in cui passi in un numero intero a bit dei tipi di servizi in primo piano. Puoi scegliere di passare uno o più valori di tipo.

In genere, devi dichiarare solo i tipi richiesti per un determinato caso d'uso. In questo modo è più facile soddisfare le aspettative del sistema per ogni tipo di servizio in primo piano. Nei casi in cui un servizio in primo piano viene avviato con più tipi, il servizio in primo piano deve ottemperare ai requisiti di applicazione della piattaforma di tutti i tipi.

ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)

Se il tipo di servizio in primo piano non è specificato nella chiamata, il valore predefinito è costituito dai valori definiti nel manifest. Se non hai specificato il tipo di servizio nel manifest, il sistema genera un errore MissingForegroundServiceTypeException.

Se il servizio in primo piano ha bisogno di nuove autorizzazioni dopo l'avvio, devi chiamare di nuovo startForeground() e aggiungere i nuovi tipi di servizi. Ad esempio, supponiamo che un'app per il fitness esegua un servizio di monitoraggio della corsa che ha sempre bisogno di informazioni location, ma potrebbe o meno richiedere le autorizzazioni media. Nel file manifest devi dichiarare sia location sia mediaPlayback. Se un utente avvia un'esecuzione e vuole semplicemente che la propria posizione venga monitorata, la tua app dovrebbe chiamare startForeground() e trasmettere solo il tipo di servizio location. Quindi, se l'utente vuole iniziare a riprodurre l'audio, chiama di nuovo startForeground() e passa location|mediaPlayback.

Controlli di runtime del sistema

Il sistema controlla l'utilizzo corretto dei tipi di servizi in primo piano e conferma che l'app abbia richiesto le autorizzazioni di runtime appropriate o utilizzi le API richieste. Ad esempio, il sistema si aspetta che le app che utilizzano il tipo di servizio in primo piano FOREGROUND_SERVICE_TYPE_LOCATION richiedano ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION.

Ciò implica che le app devono seguire un ordine di operazioni molto specifico quando richiedono autorizzazioni all'utente e avviano i servizi in primo piano. Le autorizzazioni devono essere richieste e concesse prima che l'app tenti di chiamare startForeground(). Le app che richiedono le autorizzazioni appropriate dopo l'avvio del servizio in primo piano devono modificare questo ordine di operazioni e richiedere l'autorizzazione prima di avviare il servizio in primo piano.

Le specifiche dell'applicazione della piattaforma vengono visualizzate nelle sezioni etichettate come "Requisiti di runtime" nella sezione Casi d'uso previsti e applicazione per ogni tipo di servizio in primo piano di questa pagina.

Casi d'uso previsti e applicazione forzata per ogni tipo di servizio in primo piano

In order to use a given foreground service type, you must declare a particular permission in your manifest file, you must fulfill specific runtime requirements, and your app must fulfill one of the intended sets of use cases for that type. The following sections explain the permission that you must declare, the runtime prerequisites, and the intended use cases for each type.

Fotocamera

Foreground service type to declare in manifest under android:foregroundServiceType
camera
Permission to declare in your manifest
FOREGROUND_SERVICE_CAMERA
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_CAMERA
Runtime prerequisites

Request and be granted the CAMERA runtime permission

Note: The CAMERA runtime permission is subject to while-in-use restrictions. For this reason, you cannot create a camera foreground service while your app is in the background, with a few exceptions. For more information, see Restrictions on starting foreground services that need while-in-use permissions.

Description

Continue to access the camera from the background, such as video chat apps that allow for 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 file manifest
FOREGROUND_SERVICE_DATA_SYNC
Costante da passare a startForeground()
FOREGROUND_SERVICE_TYPE_DATA_SYNC
Prerequisiti di runtime
Nessuna
Descrizione

Operazioni di trasferimento dati, ad esempio:

  • Caricamento o download di dati
  • Operazioni di backup e ripristino
  • Operazioni di importazione o esportazione
  • Recupera dati
  • Elaborazione file locale
  • Trasferire dati tra un dispositivo e il cloud tramite una rete
Alternative

Per informazioni dettagliate, vedi Alternative ai servizi in primo piano per la sincronizzazione dei dati.

Salute

Foreground service type to declare in manifest under
android:foregroundServiceType
health
Permission to declare in your manifest
FOREGROUND_SERVICE_HEALTH
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_HEALTH
Runtime prerequisites

At least one of the following conditions must be true:

Note: The BODY_SENSORS and sensor-based READ runtime permissions are subject to while-in-use restrictions. For this reason, you cannot create a health foreground service that uses body sensors while your app is in the background unless you've been granted the BODY_SENSORS_BACKGROUND (API level 33 to 35) or READ_HEALTH_DATA_IN_BACKGROUND (API level 36 and higher) permissions. For more information, see Restrictions on starting foreground services that need while-in-use permissions.

Description

Any long-running use cases to support apps in the fitness category such as exercise trackers.

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:

Nota: per verificare che l'utente abbia attivato i servizi di geolocalizzazione e abbia concesso l'accesso alle autorizzazioni di runtime, utilizza PermissionChecker#checkSelfPermission()

Nota:le autorizzazioni di runtime per l'accesso alla posizione sono soggette a limitazioni durante l'utilizzo. Per questo motivo, non puoi creare un servizio in primo piano location mentre l'app è in background, a meno che non ti sia stata concessa l'autorizzazione di runtime ACCESS_BACKGROUND_LOCATION. Per ulteriori informazioni, consulta Limitazioni all'avvio di servizi in primo piano che richiedono autorizzazioni in uso.

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 file manifest
FOREGROUND_SERVICE_MEDIA_PLAYBACK
Costante da passare a startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK
Prerequisiti di runtime
Nessuna
Descrizione
Continua la riproduzione audio o video in background. Supporta la funzionalità di registrazione video digitale (DVR) su Android TV.
Alternative
Se stai mostrando un video in modalità Picture in picture, utilizza la modalità Picture in picture.

Proiezione di contenuti multimediali

Foreground service type to declare in manifest under
android:foregroundServiceType
mediaProjection
Permission to declare in your manifest
FOREGROUND_SERVICE_MEDIA_PROJECTION
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
Runtime prerequisites

Call the createScreenCaptureIntent() method before starting the foreground service. Doing so shows a permission notification to the user; the user must grant the permission before you can create the service.

After you have created the foreground service, you can call MediaProjectionManager.getMediaProjection().

Description

Project content to non-primary display or external device using the MediaProjection APIs. This content doesn't have to be exclusively media content.

Alternatives

To stream media to another device, use the Google Cast SDK.

Microfono

Foreground service type to declare in manifest under
android:foregroundServiceType
microphone
Permission to declare in your manifest
FOREGROUND_SERVICE_MICROPHONE
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_MICROPHONE
Runtime prerequisites

Request and be granted the RECORD_AUDIO runtime permission.

Note: The RECORD_AUDIO runtime permission is subject to while-in-use restrictions. For this reason, you cannot create a microphone foreground service while your app is in the background, with a few exceptions. For more information, see Restrictions on starting foreground services that need while-in-use permissions.

Description

Continue microphone capture from the background, such as voice recorders or communication apps.

Telefonata

Foreground service type to declare in manifest under
android:foregroundServiceType
phoneCall
Permission to declare in your manifest
FOREGROUND_SERVICE_PHONE_CALL
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_PHONE_CALL
Runtime prerequisites

At least one of these conditions must be true:

  • App is the default dialer app through the ROLE_DIALER role.
Description

Continue an ongoing call using the ConnectionService APIs.

Alternatives

If you need to make phone, video, or VoIP calls, consider using the android.telecom library.

Consider using CallScreeningService to screen calls.

Messaggistica remota

Foreground service type to declare in manifest under
android:foregroundServiceType
remoteMessaging
Permission to declare in your manifest
FOREGROUND_SERVICE_REMOTE_MESSAGING
Constant to pass to startForeground()
FOREGROUND_SERVICE_TYPE_REMOTE_MESSAGING
Runtime prerequisites
None
Description
Transfer text messages from one device to another. Assists with continuity of a user's messaging tasks when they switch devices.

Servizio di Short

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 manifest in
android:foregroundServiceType
systemExempted
Autorizzazione da dichiarare nel file manifest
FOREGROUND_SERVICE_SYSTEM_EXEMPTED
Costante da passare a startForeground()
FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED
Prerequisiti di runtime
Nessuna
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.