如果應用程式指定 Android 15 以上版本,系統會限制應用程式在背景執行時,特定前景服務可執行的時間長度。目前,這項限制僅適用於 dataSync 和 mediaProcessing 前景服務類型前景服務。shortService 前景服務類型有更嚴格的限制,詳情請參閱該服務類型的說明文件。
逾時行為
系統允許 dataSync 和 mediaProcessing 前景服務在 24 小時內執行總共 6 小時,之後系統會呼叫執行中服務的 Service.onTimeout(int, int) 方法 (Android 15 推出)。(mediaProcessing 前景服務類型是在 Android 15 中新增)。dataSync 和 mediaProcessing 服務的六小時時間限制是分開計算。舉例來說,如果 dataSync 服務剛執行一小時,應用程式就只能使用 dataSync 前景服務五小時,但可以使用 mediaProcessing 服務整整六小時。
前景服務達到六小時限制後,有幾秒的時間可以呼叫 Service.stopSelf()。系統呼叫 Service.onTimeout() 後,該服務就不再視為前景服務。如果服務未呼叫 Service.stopSelf(),系統會擲回內部例外狀況。例外狀況會記錄在 Logcat 中,並顯示下列訊息:
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type [service type] did not stop within its timeout: [component name]"
為避免這項行為變更造成問題,您可以採取下列一或多項做法:
- 讓服務實作新的
Service.onTimeout(int, int)方法。應用程式收到回呼時,請務必在幾秒內呼叫stopSelf()。(如果您未立即停止應用程式,系統會產生失敗)。 - 請確保應用程式的
dataSync和mediaProcessing服務在任何 24 小時內,執行時間總計不超過 6 小時 (除非使用者與應用程式互動,重設計時器)。 - 只有在使用者直接互動時,才啟動
dataSync或mediaProcessing前景服務。由於應用程式在服務啟動時處於前景,因此在應用程式進入背景後,服務有整整六小時的時間。 - 請改用 WorkManager 等替代 API。具體來說,請考慮使用替代 API,而非
dataSync前景服務。
如果應用程式的 dataSync 前景服務在過去 24 小時內已執行 6 小時,則除非使用者將應用程式移至前景 (這會重設計時器),否則您無法啟動其他 dataSync 前景服務。如果嘗試啟動其他 dataSync 前景服務,系統會擲回 ForegroundServiceStartNotAllowedException,並顯示「Time limit already exhausted for foreground service type dataSync」等錯誤訊息。
測試
如要測試應用程式的行為,即使應用程式並非指定 Android 15 為目標版本,您也可以啟用資料同步逾時功能 (只要應用程式在 Android 15 裝置上執行即可)。如要啟用逾時功能,請執行下列 adb 指令:
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
您也可以調整逾時時間,以便測試應用程式在達到限制時的行為。如要為 dataSync 前景服務設定新的逾時時間,請執行下列 adb 指令:
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
如要為 mediaProcessing 前景服務設定新的逾時期限,請執行下列指令:
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds