如果應用程式指定 Android 12 (API 級別 31) 以上版本,在背景執行時就無法啟動前景服務 (少數特殊情況除外)。如果應用程式在背景執行時嘗試啟動前景服務,且該前景服務不符合任何例外情況,系統就會擲回 ForegroundServiceStartNotAllowedException
。
此外,如果應用程式想啟動需要使用期間權限的前景服務 (例如人體感應器、相機、麥克風或位置資訊權限),即使應用程式符合背景啟動限制的豁免條件,在背景執行時也無法建立該服務。如要瞭解原因,請參閱「限制啟動需要『僅限使用期間』權限的前景服務」一節。
背景啟動限制的豁免條件
在下列情況下,即使應用程式在背景執行,也能啟動前景服務:
- 應用程式從使用者可見的狀態轉換,例如活動。
- 您的應用程式可以從背景啟動活動,但如果應用程式在現有工作的回溯堆疊中含有活動,則不在此限。
應用程式透過 Firebase 雲端通訊接收高優先順序訊息。
應用程式會叫用精確鬧鐘,完成使用者要求的動作。
您的應用程式是裝置目前的輸入法。
裝置重新啟動並在廣播接收器中收到
」。ACTION_BOOT_COMPLETED
、ACTION_LOCKED_BOOT_COMPLETED
或ACTION_MY_PACKAGE_REPLACED
意圖動作後。BOOT_COMPLETED
應用程式會在廣播接收器中收到
ACTION_TIMEZONE_CHANGED
、ACTION_TIME_CHANGED
或ACTION_LOCALE_CHANGED
意圖動作。應用程式會從
NfcService
收到ACTION_TRANSACTION_DETECTED
事件。應用程式使用隨附裝置管理工具,並聲明
REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
權限或REQUEST_COMPANION_RUN_IN_BACKGROUND
權限。請盡可能使用REQUEST_COMPANION_START_FOREGROUND_SERVICES_FROM_BACKGROUND
。使用者關閉應用程式的電池效能最佳化功能。
應用程式持有
SYSTEM_ALERT_WINDOW
權限。注意:如果應用程式指定 Android 15 以上版本,就必須具備SYSTEM_ALERT_WINDOW
權限,且應用程式目前必須有可見的疊加視窗。
啟動需要「僅限使用期間」權限的前景服務時的限制
在 Android 14 (API 級別 34) 以上版本中,如果啟動需要「僅在使用期間」權限的前景服務,請注意以下特殊情況。
如果應用程式指定 Android 14 以上版本,當您建立前景服務時,作業系統會進行檢查,確保應用程式具備該服務類型的所有適當權限。舉例來說,當您建立 microphone 類型的前景服務時,作業系統會驗證您的應用程式目前是否具有 RECORD_AUDIO
權限。如果沒有該權限,系統會擲回 SecurityException
。
如果是「僅限使用期間」權限,這可能會造成問題。如果應用程式具備「僅在使用該應用程式時允許」權限,就只能在前景中取得這項權限。也就是說,如果應用程式在背景執行,並嘗試建立相機、位置資訊或麥克風類型的前景服務,系統會發現應用程式目前沒有必要權限,並擲回 SecurityException
。
同樣地,如果應用程式在背景建立需要 BODY_SENSORS
權限的健康服務,但應用程式目前沒有該權限,系統就會擲回例外狀況。(如果這是需要不同權限的健康照護服務 (例如 ACTIVITY_RECOGNITION
),則不適用此情況。) 呼叫 PermissionChecker.checkSelfPermission()
「不會」避免這個問題。如果應用程式具有「僅限使用期間」權限,且呼叫 checkSelfPermission()
檢查是否具備該權限,即使應用程式在背景執行,該方法也會傳回 PERMISSION_GRANTED
。如果方法傳回 PERMISSION_GRANTED
,表示「應用程式在使用期間擁有這項權限」。
因此,如果前景服務需要「僅限使用期間」權限,您必須在應用程式有可見活動時呼叫 Context.startForegroundService()
或 Context.bindService()
,除非該服務符合定義的豁免條件。
「僅限使用期間」權限限制的豁免條件
在某些情況下,即使應用程式 在背景執行時啟動前景服務,應用程式仍可在前景執行時 (「僅限使用時」) 存取位置、相機和麥克風資訊。
在上述情況下,如果服務聲明 location
前景服務類型,且是由具備 ACCESS_BACKGROUND_LOCATION
權限的應用程式啟動,則服務可以隨時存取位置資訊,即使應用程式在背景執行也不例外。
以下列出這些情況:
- 系統元件會啟動這項服務。
- 這項服務會先與應用程式小工具互動。
- 服務會先與通知互動。
- 這項服務會以
PendingIntent
的形式啟動,並從其他可見的應用程式傳送。 - 這項服務是由以裝置擁有者模式執行的裝置政策控制器應用程式啟動。
- 這項服務是由提供
VoiceInteractionService
的應用程式啟動。 - 這項服務是由具備
START_ACTIVITIES_FROM_BACKGROUND
特殊權限的應用程式啟動。
判斷應用程式中受影響的服務
測試應用程式時,請啟動前景服務。如果已啟動的服務受限,無法存取位置資訊、麥克風和相機,Logcat 中會顯示以下訊息:
Foreground service started from background can not have \ location/camera/microphone access: service SERVICE_NAME