前景服務逾時

如果應用程式指定 Android 15 以上版本,系統會限制應用程式在背景執行時,可執行特定前景服務的時間長度。目前,這項限制只適用於 dataSyncmediaProcessing 前景服務類型前景服務。shortService 前景服務類型另有較嚴格的限制規定,請參閱該服務類型的說明文件。

逾時行為

系統允許 dataSyncmediaProcessing 前景服務在 24 小時內執行共計 6 小時,之後系統會呼叫執行服務的 Service.onTimeout(int, int) 方法 (在 Android 15 中推出)。(Android 15 新增了 mediaProcessing 前景服務類型)。系統會分別追蹤 dataSyncmediaProcessing 服務的六小時時間限制。舉例來說,如果 dataSync 服務只執行一小時,應用程式就只有五小時可用於 mediaProcessing 前景服務,但可用於 dataSync 服務的時間則是完整的六小時。

當前景服務達到六小時限制時,服務會有幾秒的時間呼叫 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]"

為避免這項行為變更發生問題,您可以採取下列一或多項做法:

  1. 請讓服務實作新的 Service.onTimeout(int, int) 方法。應用程式收到回呼時,請務必在幾秒內呼叫 stopSelf()。(如果您沒有立即停止應用程式,系統會產生失敗)。
  2. 請確認應用程式的 dataSyncmediaProcessing 服務在任何 24 小時內的總執行時間不超過 6 小時 (除非使用者與應用程式互動,重新設定計時器)。
  3. 只有在使用者直接互動的情況下,才能啟動 dataSyncmediaProcessing 前景服務;由於您的應用程式在服務啟動時位於前景,因此應用程式進入背景後,您的服務有 6 個小時可持續運作。
  4. 請改用 WorkManager 等其他 API,而非這些前景服務。特別是,請考慮改用其他 API,而非使用 dataSync 前景服務。

如果應用程式的 dataSync 前景服務在過去 24 小時內已執行 6 小時,您就無法啟動其他 dataSync 前景服務,除非使用者將應用程式移至前景 (這樣會重設計時器)。如果您嘗試啟動其他 dataSync 前景服務,系統會擲回 ForegroundServiceStartNotAllowedException,並顯示「前景服務類型 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