I tipi di servizi in primo piano sono obbligatori

Per aiutare gli sviluppatori a definire in modo più intenzionale i servizi in primo piano rivolti agli utenti, Android 10 ha introdotto l'attributo android:foregroundServiceType all'interno dell'elemento <service>.

Se la tua app ha come target Android 14, deve specificare i tipi di servizio in primo piano appropriati. Come nelle versioni precedenti di Android, è possibile combinare più tipi. Questo elenco mostra i tipi di servizi in primo piano tra cui scegliere:

Se un caso d'uso nella tua app non è associato a nessuno di questi tipi, ti consigliamo vivamente di eseguire la migrazione della logica per utilizzare WorkManager o i job di trasferimento di dati avviati dall'utente.

I tipi health, remoteMessaging, shortService, specialUse e systemExempted sono una novità di Android 14.

Il seguente snippet di codice fornisce un esempio di dichiarazione di un tipo di servizio in primo piano nel file 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>

Se un'app che ha come target Android 14 non definisce i tipi per un determinato servizio nel manifest, il sistema attiverà MissingForegroundServiceTypeException quando viene chiamata startForeground() per quel servizio.

Dichiara una nuova autorizzazione per l'utilizzo dei 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 runtime

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

Per utilizzare un determinato tipo di servizio in primo piano, devi dichiarare una determinata autorizzazione nel file manifest, soddisfare requisiti di runtime specifici e la tua app deve soddisfare uno degli insiemi di casi d'uso previsti per quel tipo. Le sezioni seguenti spiegano l'autorizzazione che devi dichiarare, i prerequisiti di runtime e i casi d'uso previsti per ciascun tipo.

Fotocamera

Tipo di servizio in primo piano da dichiarare nel manifest in android:foregroundServiceType
camera
Autorizzazione da dichiarare nel file manifest
FOREGROUND_SERVICE_CAMERA
Costante da passare a startForeground()
FOREGROUND_SERVICE_TYPE_CAMERA
Prerequisiti di runtime

Richiedere e ottenere l'autorizzazione di runtime CAMERA

Nota:l'autorizzazione di runtime CAMERA è soggetta a limitazioni durante l'utilizzo. Per questo motivo, non puoi creare un servizio in primo piano camera mentre l'app è in background, con alcune eccezioni. Per ulteriori informazioni, consulta Limitazioni all'avvio di servizi in primo piano che richiedono autorizzazioni in uso.

Descrizione

Continuare ad accedere alla fotocamera in background, 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 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.

Integrità

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:

Nota: le autorizzazioni di runtime BODY_SENSORS e LETTURA basate su sensori sono soggette a restrizioni durante l'uso. Per questo motivo, non puoi creare un servizio in primo piano health che utilizza i sensori del corpo mentre la tua app è in background, a meno che non ti siano state concesse le autorizzazioni BODY_SENSORS_BACKGROUND (livello API da 33 a 35) o READ_HEALTH_DATA_IN_BACKGROUND (livello API 36 e versioni successive). Per ulteriori informazioni, consulta Limitazioni all'avvio dei servizi in primo piano che necessitano di autorizzazioni durante l'utilizzo.

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:

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

Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceType
microphone
Autorizzazione da dichiarare nel file 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.

Nota:l'autorizzazione di runtime RECORD_AUDIO è soggetta a limitazioni durante l'utilizzo. Per questo motivo, non puoi creare un servizio in primo piano microphone mentre la tua app è in background, con alcune eccezioni. Per ulteriori informazioni, consulta Limitazioni all'avvio di servizi in primo piano che richiedono autorizzazioni in uso.

Descrizione

Continuare l'acquisizione del microfono in background, ad esempio da 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 file 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 Telefono predefinita tramite il ruolo ROLE_DIALER.
Descrizione

Continuare una chiamata in corso utilizzando le API ConnectionService.

Alternative

Se devi effettuare chiamate vocali, videochiamate o VoIP, ti consigliamo di utilizzare la raccolta 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

要在清单中的以下位置声明的前台服务类型
android:foregroundServiceType
shortService
在清单中声明的权限
要传递给 startForeground() 的常量
FOREGROUND_SERVICE_TYPE_SHORT_SERVICE
运行时前提条件
说明

快速完成不可中断或推迟的关键工作。

这种类型有一些独特的特征:

  • 只能持续运行一小段时间(大约 3 分钟)。
  • 不支持粘性前台服务。
  • 无法启动其他前台服务。
  • 不需要类型专用权限,不过它仍需要 FOREGROUND_SERVICE 权限。
  • 只有当应用当前符合启动新前台服务的条件时,shortService 才能更改为其他服务类型。
  • 前台服务可以随时将其类型更改为 shortService,届时超时期限将开始。

shortService 的超时时间从调用 Service.startForeground() 开始算起。应用应在发生超时之前调用 Service.stopSelf()Service.stopForeground()。否则,系统会调用新的 Service.onTimeout(),让应用有机会调用 stopSelf()stopForeground() 来停止其服务。

调用 Service.onTimeout() 后的短时间内,应用会进入缓存状态,并且不再被视为处于前台,除非用户正在主动与应用互动。应用缓存一小段时间后,服务还未停止,该应用会收到 ANR 消息。ANR 消息提及 FOREGROUND_SERVICE_TYPE_SHORT_SERVICE。出于这些原因,实现 Service.onTimeout() 回调被视为一种最佳实践。

Android 13 及更低版本中不存在 Service.onTimeout() 回调。如果同一服务在此类设备上运行,则不会出现超时,也不会发生 ANR。确保您的服务在完成处理任务后立即停止,即使它尚未收到 Service.onTimeout() 回调也是如此。

请务必注意,如果未遵循 shortService 的超时设置,即使应用还有其他有效的前台服务或其他应用生命周期进程,应用也会遇到 ANR。

如果应用对用户可见,或满足允许从后台启动前台服务的某一豁免条件,则使用 FOREGROUND_SERVICE_TYPE_SHORT_SERVICE 参数再次调用 Service.StartForeground() 会将超时时间再延长 3 分钟。如果应用对用户不可见且不满足其中一个豁免条件,则尝试启动其他前台服务(无论其类型如何)都会导致 ForegroundServiceStartNotAllowedException

即使用户为您的应用停用电池优化功能,仍然会受到 shortService FGS 的影响。

如果您启动包含 shortService 类型和另一个前台服务类型的前台服务,系统会忽略 shortService 类型声明。不过,该服务仍必须遵守其他声明类型的先决条件。如需了解详情,请参阅前台服务文档

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>

Sistema esente

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 di tipi di servizi in primo piano

如果您的应用以 Android 14 或更高版本为目标平台,您需要在 Play 管理中心的“应用内容”页面(政策 > 应用内容)中声明应用的前台服务类型。如需详细了解如何在 Play 管理中心内声明前台服务类型,请参阅了解前台服务和全屏 intent 要求