為了協助開發人員更明確地定義面向使用者的前景服務,Android 10 在 <service> 元素中導入了 android:foregroundServiceType 屬性。
如果您的應用程式指定 Android 14 為目標,則必須指定適當的前景服務類型。與先前的 Android 版本相同,開發人員可以將多種類型合併使用。這份清單列出可供選擇的前景服務類型:
cameraconnectedDevicedataSynchealthlocationmediaPlaybackmediaProjectionmicrophonephoneCallremoteMessagingshortServicespecialUsesystemExempted
如果應用程式的用途與上述任一類型無關,強烈建議您遷移邏輯,以便使用 WorkManager 或使用者啟動的資料移轉作業。
Android 14 新增 health, remoteMessaging, shortService, specialUse 和 systemExempted 類型。
以下程式碼片段提供資訊清單中的前景服務類型宣告範例:
<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>
如果以 Android 14 為目標的應用程式未在資訊清單中定義特定服務類型,則系統將會在呼叫該服務的 startForeground() 時提高 MissingForegroundServiceTypeException。
宣告使用前景服務類型的新權限
If apps that target Android 14 use a foreground service, they must declare a specific permission, based on the foreground service type, that Android 14 introduces. These permissions appear in the sections labeled "permission that you must declare in your manifest file" in the intended use cases and enforcement for each foreground service type section on this page.
All of the permissions are defined as normal permissions and are granted by default. Users cannot revoke these permissions.
在執行階段加入前景服務類型
啟動前景服務應用程式的最佳做法是使用 startForeground() 的 ServiceCompat 版本 (適用於 androidx-core 1.12 以上版本),在此版本中,您會傳入以位元為單位的前景服務類型整數。您可以選擇傳送一或多個類型值。
一般而言,您只需要宣告特定用途所需的類型。這樣可更容易達成系統對每個前景服務類型的預期要求。如果前景服務是透過多種類型啟動,則前景服務必須遵循所有類型的平台強制執行要求。
ServiceCompat.startForeground(0, notification, FOREGROUND_SERVICE_TYPE_LOCATION)
如未在呼叫中指定前景服務類型,則該類型會預設為資訊清單中所定義的值。如果您未在資訊清單中指定服務類型,系統會擲回 MissingForegroundServiceTypeException。
如果前景服務在啟動後需要新權限,您應再次呼叫 startForeground() 並新增服務類型。舉例來說,假設健身應用程式執行跑步追蹤服務,該服務一律需要 location 資訊,但可能需要或不需要 media 權限。您必須在資訊清單中宣告 location 和 mediaPlayback。如果使用者開始跑步,且只希望追蹤其位置,應用程式應呼叫 startForeground(),並僅傳遞 location 服務類型。接著,如果使用者想開始播放音訊,請再次呼叫 startForeground() 並傳遞 location|mediaPlayback。
系統執行階段檢查
系統會檢查前景服務類型的使用是否恰當,並確認應用程式已要求合適的執行階段權限,或使用必要的 API。例如,系統會預期使用 FOREGROUND_SERVICE_TYPE_LOCATION 前景服務類型的應用程式要求 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION。
這表示當應用程式向使用者要求權限並啟動前景服務時,必須遵循特別明確的作業順序。應用程式必須先要求並取得權限,再嘗試呼叫 startForeground()。如果應用程式在前景服務啟動後才要求適當權限,則必須先變更此作業順序並要求權限,才能啟動前景服務。
關於平台違規處置的具體細節,請參閱本頁各前景服務類型預期用途與違規處置一節的「執行階段規定」部分。
各種前景服務類型的預期用途與違規處置
您必須在資訊清單檔案中宣告特定權限,並滿足特定執行階段要求,而且應用程式必須滿足該類型預期用途的其中一項,才能使用特定的前景服務類型。以下各節說明您必須宣告的權限、執行階段先決條件,以及各個類型的預期用途。
相機
- 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
CAMERAruntime permissionNote: The
CAMERAruntime permission is subject to while-in-use restrictions. For this reason, you cannot create acameraforeground 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.
已連結的裝置
- 要在下列資訊清單中宣告的前景服務類型
android:foregroundServiceTypeconnectedDevice- 在資訊清單中宣告的權限
FOREGROUND_SERVICE_CONNECTED_DEVICE- 要傳遞至
startForeground()的常數 FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE- 執行階段必要條件
至少必須符合下列其中一項條件:
在資訊清單中至少宣告下列其中一項權限:
至少要求下列其中一項執行階段權限,並獲得授予:
- 說明
與需要藍牙、NFC、IR、USB 或網路連線的外部裝置互動。
- 替代選項
如果您的應用程式需要持續將資料傳輸至外部裝置,建議改用隨附裝置管理工具。使用隨附裝置狀態 API,讓應用程式在隨附裝置在範圍內時持續執行。
如果應用程式需要掃描藍牙裝置,建議改用 Bluetooth 掃描 API。
同步處理資料
- Foreground service type to declare in manifest under
android:foregroundServiceTypedataSync- Permission to declare in your manifest
FOREGROUND_SERVICE_DATA_SYNC- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_DATA_SYNC- Runtime prerequisites
- None
- Description
Data transfer operations, such as the following:
- Data upload or download
- Backup-and-restore operations
- Import or export operations
- Fetch data
- Local file processing
- Transfer data between a device and the cloud over a network
- Alternatives
See Alternatives to data sync foreground services for detailed information.
健康度
- 要在資訊清單中宣告的前景服務類型
android:foregroundServiceTypehealth- 在資訊清單中宣告的權限
FOREGROUND_SERVICE_HEALTH- 要傳遞至
startForeground()的常數 FOREGROUND_SERVICE_TYPE_HEALTH- 執行階段必要條件
至少必須符合下列其中一項條件:
在資訊清單中宣告
HIGH_SAMPLING_RATE_SENSORS權限。至少要求下列其中一項執行階段權限,並獲得授予:
注意:
BODY_SENSORS和感應器的 READ 執行階段權限會受到使用期間限制。因此,除非您已獲得BODY_SENSORS_BACKGROUND(API 級別 33 至 35) 或READ_HEALTH_DATA_IN_BACKGROUND(API 級別 36 以上) 權限,否則無法在應用程式處於背景執行時,建立使用身體感應器的health前景服務。詳情請參閱「啟動需要使用中權限的前景服務的限制」。- 說明
在健身類別中,任何用於支援應用程式的長時間執行用途,例如:運動追蹤器。
位置
- 要在下列資訊清單中宣告的前景服務類型
android:foregroundServiceTypelocation- 在資訊清單中宣告的權限
FOREGROUND_SERVICE_LOCATION- 要傳遞至
startForeground()的常數 FOREGROUND_SERVICE_TYPE_LOCATION- 執行階段必要條件
使用者必須已啟用定位服務,且應用程式必須獲得下列至少一項執行階段權限:
注意:如要確認使用者已啟用位置服務,並授予執行階段權限存取權,請使用
PermissionChecker#checkSelfPermission()注意:位置資訊執行階段權限適用於使用期間的限制。因此,除非您已獲得
ACCESS_BACKGROUND_LOCATION執行階段權限,否則無法在應用程式處於背景執行時建立location前景服務。詳情請參閱「啟動需要使用中權限的前景服務的限制」。- 說明
需要位置資訊存取權的長時間執行使用案例,如:導航和位置分享。
- 替代選項
如果應用程式需要在使用者抵達特定地點時觸發,建議改用 地理圍欄 API。
媒體
- Foreground service type to declare in manifest under
android:foregroundServiceTypemediaPlayback- Permission to declare in your manifest
FOREGROUND_SERVICE_MEDIA_PLAYBACK- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK- Runtime prerequisites
- None
- Description
- Continue audio or video playback from the background. Support Digital Video Recording (DVR) functionality on Android TV.
- Alternatives
- If you're showing picture-in-picture video, use Picture-in-Picture mode.
媒體投影
- 要在下列資訊清單中宣告的前景服務類型
android:foregroundServiceTypemediaProjection- 在資訊清單中宣告的權限
FOREGROUND_SERVICE_MEDIA_PROJECTION- 要傳遞至
startForeground()的常數 FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION- 執行階段必要條件
請先呼叫
createScreenCaptureIntent()方法,再啟動前景服務。這麼做會向使用者顯示權限通知,使用者必須授予權限,您才能建立服務。建立前景服務後,您可以呼叫
MediaProjectionManager.getMediaProjection()。- 說明
使用
MediaProjectionAPI 將內容投放到非主要螢幕或外部裝置。此類內容不侷限於媒體內容。- 替代選項
如要將媒體串流至其他裝置,請使用 Google Cast SDK。
麥克風
- Foreground service type to declare in manifest under
android:foregroundServiceTypemicrophone- 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_AUDIOruntime permission.Note: The
RECORD_AUDIOruntime permission is subject to while-in-use restrictions. For this reason, you cannot create amicrophoneforeground 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.
語音通話
- 要在下列資訊清單中宣告的前景服務類型
android:foregroundServiceTypephoneCall- 在資訊清單中宣告的權限
FOREGROUND_SERVICE_PHONE_CALL- 要傳遞至
startForeground()的常數 FOREGROUND_SERVICE_TYPE_PHONE_CALL- 執行階段必要條件
至少必須符合下列其中一項條件:
- 應用程式已在資訊清單檔案中宣告
MANAGE_OWN_CALLS權限。
- 應用程式已在資訊清單檔案中宣告
- 應用程式是透過
ROLE_DIALER角色成為預設撥號應用程式。
- 應用程式是透過
- 說明
使用
ConnectionServiceAPI 繼續目前的通話。- 替代選項
如果您需要撥打電話、視訊或 VoIP 通話,請考慮使用
android.telecom程式庫。建議您使用
CallScreeningService來過濾來電。
遠端通訊
- Foreground service type to declare in manifest under
android:foregroundServiceTyperemoteMessaging- 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.
短程服務
- Foreground service type to declare in manifest under
android:foregroundServiceTypeshortService- Permission to declare in your manifest
- None
- Constant to pass to
startForeground() FOREGROUND_SERVICE_TYPE_SHORT_SERVICE- Runtime prerequisites
- None
- Description
Quickly finish critical work that cannot be interrupted or postponed.
This type has some unique characteristics:
- Can only run for a short period of time (about 3 minutes).
- No support for sticky foreground services.
- Cannot start other foreground services.
- Doesn't require a type-specific permission, though it still
requires the
FOREGROUND_SERVICEpermission. - A
shortServicecan only change to another service type if the app is currently eligible to start a new foreground service. - A foreground service can change its type to
shortServiceat any time, at which point the timeout period begins.
The timeout for shortService begins from the moment that
Service.startForeground()is called. The app is expected to callService.stopSelf()orService.stopForeground()before the timeout occurs. Otherwise, the newService.onTimeout()is called, giving apps a brief opportunity to callstopSelf()orstopForeground()to stop their service.A short time after
Service.onTimeout()is called, the app enters a cached state and is no longer considered to be in the foreground, unless the user is actively interacting with the app. A short time after the app is cached and the service has not stopped, the app receives an ANR. The ANR message mentionsFOREGROUND_SERVICE_TYPE_SHORT_SERVICE. For these reasons, it's considered best practice to implement theService.onTimeout()callback.The
Service.onTimeout()callback doesn't exist on Android 13 and lower. If the same service runs on such devices, it doesn't receive a timeout, nor does it ANR. Make sure that your service stops as soon as it finishes the processing task, even if it hasn't received theService.onTimeout()callback yet.It's important to note that if the timeout of the
shortServiceis not respected, the app will ANR even if it has other valid foreground services or other app lifecycle processes running.If an app is visible to the user or satisfies one of the exemptions that allow foreground services to be started from the background, calling
Service.StartForeground()again with theFOREGROUND_SERVICE_TYPE_SHORT_SERVICEparameter extends the timeout by another 3 minutes. If the app isn't visible to the user and doesn't satisfy one of the exemptions, any attempt to start another foreground service, regardless of type, causes aForegroundServiceStartNotAllowedException.If a user disables battery optimization for your app, it's still affected by the timeout of shortService FGS.
If you start a foreground service that includes the
shortServicetype and another foreground service type, the system ignores theshortServicetype declaration. However, the service must still adhere to the prerequisites of the other declared types. For more information, see the Foreground services documentation.
特殊用途
- 要在資訊清單中宣告的前景服務類型
android:foregroundServiceTypespecialUse- 在資訊清單中宣告的權限
FOREGROUND_SERVICE_SPECIAL_USE- 要傳遞至
startForeground()的常數 FOREGROUND_SERVICE_TYPE_SPECIAL_USE- 執行階段必要條件
- 無
- 說明
包含其他未涵蓋的有效前景服務用途 前景服務類型
除了宣告
FOREGROUND_SERVICE_TYPE_SPECIAL_USE之外, 前景服務類型,則開發人員應在 資訊清單。方法是指定<property><service>元素。這些值和對應的用途 在 Google Play 管理中心提交應用程式時進行審查使用 這類案例採用形式不拘,請務必提供充分的資訊 相關資訊,以便審查人員瞭解您必須使用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>
不受規範的系統
- 要在下列資訊清單中宣告的前景服務類型
android:foregroundServiceTypesystemExempted- 在資訊清單中宣告的權限
FOREGROUND_SERVICE_SYSTEM_EXEMPTED- 要傳遞至
startForeground()的常數 FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED- 執行階段必要條件
- 無
- 說明
系統應用程式和特定系統整合的預留項目,以便其繼續使用前景服務。
如要使用此類型,應用程式必須至少符合下列其中一項條件:
- 裝置處於展示模式狀態
- 應用程式為裝置擁有者
- 應用程式為分析器擁有者
- 具有
ROLE_EMERGENCY角色的安全應用程式 - 裝置管理員應用程式
- 擁有
SCHEDULE_EXACT_ALARM或USE_EXACT_ALARM權限,並使用前景服務在背景繼續鬧鐘 (包括僅震動鬧鐘)。 VPN 應用程式 (使用「設定」>「網路和網際網路」>「VPN」進行設定)
否則,宣告此類型會導致系統擲回
ForegroundServiceTypeNotAllowedException。
Google Play 對於使用前景服務類型的政策違規處置
If your app targets Android 14 or higher, you'll need to declare your app's foreground service types in the Play Console's app content page (Policy > App content). For more information on how to declare your foreground service types in Play Console, see Understanding foreground service and full-screen intent requirements.