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 devi anche richiedere 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 avviarlo.
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:foregroundServiceTypeconnectedDevice- 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:foregroundServiceTypedataSync- 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:foregroundServiceTypehealth- 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_SENSORSnel file manifest.Richiedi e ottieni almeno una delle seguenti autorizzazioni di runtime:
BODY_SENSORSsull'API 35 e versioni precedentiREAD_HEART_RATEREAD_SKIN_TEMPERATUREREAD_OXYGEN_SATURATIONACTIVITY_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:foregroundServiceTypelocation- 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:foregroundServiceTypemediaPlayback- 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:foregroundServiceTypemediaProcessing- 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
mediaProcessingservizi 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:foregroundServiceTypemediaProjection- 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:foregroundServiceTypemicrophone- 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:foregroundServiceTypephoneCall- 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_CALLSnel 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
CallScreeningServiceper filtrare le chiamate.
Messaggistica remota
- Tipo di servizio in primo piano da dichiarare nel manifest in
android:foregroundServiceTyperemoteMessaging- 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:foregroundServiceTypeshortService- 在清单中声明的权限
- 无
- 要传递给
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:foregroundServiceTypespecialUse- 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_USEtipo 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
- 要在其清单中声明的前台服务类型
android:foregroundServiceTypesystemExempted- 在清单中声明的权限
FOREGROUND_SERVICE_SYSTEM_EXEMPTED- 要传递给
startForeground()的常量 FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED- 运行时前提条件
- 无
- 说明
为系统应用和特定系统集成预留,以便继续使用前台服务。
如需使用此类型,应用必须至少满足以下条件之一:
- 设备处于演示模式状态
- 应用是设备所有者
- 应用是性能分析器所有者
- 属于具有
ROLE_EMERGENCY角色的安全应用 - 属于设备管理应用
- 具有
SCHEDULE_EXACT_ALARM或USE_EXACT_ALARM权限的应用 VPN 应用(通过设置 > 网络和互联网 > VPN 进行配置)
否则,声明此类型会导致系统抛出
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.