應用程式經常需要同時執行多項工作。Android API 提供許多不同的方式,讓您執行這項操作。選擇正確的選項非常重要,某個選項可能適合某種情況,但不適合另一種情況。選擇錯誤的 API 可能會影響應用程式的效能或資源效率,導致電池耗電量增加,並降低使用者裝置的整體效能。在某些情況下,選擇錯誤的方法可能會導致您的應用程式無法在 Play 商店中列出。
本文將說明您可用的各種選項,並協助您選擇最適合您情況的選項。
術語
與背景工作相關的部分重要術語可能會以多種相互矛盾的方式使用。因此,請務必定義我們的條款。
如果應用程式在背景執行,系統會對其設下多項限制。(舉例來說,在大多數情況下,背景中的應用程式無法啟動前景服務)。
在本文件中,我們將使用「工作」一詞,代表應用程式在主要工作流程外執行的作業。為確保您能正確理解這項功能,我們將其歸類為三個主要類別:非同步工作、工作排程 API 和前景服務。
選擇合適的選項
在大多數情況下,您可以透過瞭解工作所屬的類別 (非同步工作、工作排程 API 或前景服務),找出適合工作使用的 API。
如果您仍不確定,可以使用我們提供的流程圖,進一步判斷。本文後續會詳細說明每個選項。
對於背景工作,您需要考量兩種主要情況:
這兩種情境都有各自的決策樹。
非同步工作
在許多情況下,應用程式只需要在前景執行時執行並行作業。舉例來說,應用程式可能需要執行耗時的運算。如果在 UI 執行緒上執行計算,使用者必須等到計算作業完成後才能與應用程式互動;這可能會導致 ANR 錯誤。在這種情況下,應用程式應使用非同步工作選項。
常見的非同步工作選項包括 Kotlin 協同程式和 Java 執行緒。如需更多資訊,請參閱非同步工作說明文件。請注意,與背景工作 API 不同,如果應用程式停止處於有效的生命週期階段 (例如,如果應用程式離開前景),則無法保證非同步工作會完成。
工作排程 API
當您需要執行即使使用者離開應用程式也要繼續執行的工作時,工作排程 API 會是更具彈性的選項。在大多數情況下,執行背景工作時的最佳選項是使用 WorkManager,但在某些情況下,使用平台 JobScheduler
API 可能會比較適合。
WorkManager 是一款功能強大的程式庫,可讓您視需要設定簡單或複雜的工作。您可以使用 WorkManager 安排工作,在特定時間執行,或指定工作應執行的條件。您甚至可以設定工作鏈結,讓每項工作依序執行,並將結果傳遞給下一個工作。如要瞭解所有可用選項,請參閱 WorkManager 功能清單。
背景工作最常見的情況包括:
- 定期從伺服器擷取資料
- 擷取感應器資料 (例如步數計數器資料)
- 取得定期位置資料 (您必須在 Android 10 以上版本中獲得
ACCESS_BACKGROUND_LOCATION
權限) - 根據內容觸發事件上傳內容,例如相機拍攝的照片
前景服務
前景服務提供強大的功能,可立即執行不應中斷的工作。不過,前景服務可能會為裝置帶來沉重的負載,有時還會影響隱私權和安全性。基於這些原因,系統會對應用程式使用前景服務的方式和時機設下許多限制。舉例來說,前景服務必須讓使用者注意到,而且在大多數情況下,應用程式在背景執行時無法啟動前景服務。詳情請參閱前景服務說明文件。
建立前景服務的方法有兩種。您可以宣告自己的 Service
,並呼叫 Service.startForeground()
,指定該服務為前景服務。或者,您也可以使用 WorkManager 建立前景服務,如「支援長時間執行的工作站」一文所述。不過,請務必注意,由 WorkManager 建立的前景服務必須遵守所有與其他前景服務相同的限制。WorkManager 只提供一些方便的 API,讓您更輕鬆地建立前景服務。
其他 API
系統會提供其他 API,這些 API 的設計目的是針對更具體的用途提供更佳效能。如果您的用途有其他 API 可用,建議您使用該 API 而非前景服務,因為這應該有助於提升應用程式效能。前景服務類型說明文件會指出,當有其他可用的 API 可用於取代特定前景服務類型時,應使用哪個 API。
使用其他 API 最常見的情況包括:
- 使用使用者啟動的資料移轉功能進行大量下載或上傳作業,而非建立資料同步處理前景服務
- 使用隨附裝置管理工具進行藍牙配對和資料傳輸,而非使用已連結裝置的前景服務
- 使用子母畫面模式播放影片,而非建立媒體播放前景服務
使用者啟動的任務
如果應用程式需要執行背景工作,且使用者在應用程式可見時啟動作業,請回答下列問題,找出正確的方法。
當應用程式在背景執行時,任務是否需要繼續執行?
如果工作在應用程式處於背景執行時不需要繼續執行,您應使用非同步工作。執行非同步工作的選項有很多種。請務必瞭解,如果應用程式進入背景,這些選項都會停止運作。應用程式關閉時也會停止。舉例來說,社群媒體應用程式可能會想重新整理內容動態消息,但如果使用者離開畫面,應用程式就不需要完成這項作業。
如果工作延後或中斷,會造成不好的使用者體驗嗎?
請務必考量延後或取消工作是否會影響使用者體驗。舉例來說,如果應用程式需要更新資產,使用者可能不會注意到作業是否立即執行,或是在裝置充電時於半夜執行。在這種情況下,您應使用背景工作選項。
是否為短時間內必須完成的重要工作?
如果工作無法延遲,且會很快完成,您可以使用類型為 shortService
的前景服務。相較於其他前景服務,這類服務更容易建立,而且不需要那麼多權限。不過,短篇服務必須在三分鐘內完成。
是否有專門用於此用途的替代 API?
如果使用者可以看到該工作,建議您使用前景服務。這些服務一啟動就會持續執行,因此如果中斷工作會導致使用者體驗不佳,這類服務就是不錯的選擇。舉例來說,健身追蹤應用程式可能會使用位置感應器,讓使用者在地圖上記錄慢跑路線。您不應使用背景工作選項執行這項操作,因為如果工作已暫停,追蹤功能就會立即停止。在這種情況下,前景服務最適合。
不過,由於前景服務可能會使用大量裝置資源,因此系統會對前景服務的使用時機和方式設下許多限制。在許多情況下,您可以使用替代 API 來處理工作,而無需使用前景服務,這樣就能減少問題。舉例來說,如果應用程式需要在使用者抵達特定位置時採取動作,建議您使用地理圍欄 API,而非透過前景服務追蹤使用者的位置。
回應事件的工作
有時,應用程式需要執行背景工作,以回應觸發事件,例如:
- 廣播訊息
- Firebase 雲端通訊 (FCM) 訊息
- 應用程式設定的鬧鐘
這可能是外部觸發事件 (例如 FCM 訊息),也可能是應用程式自行設定的鬧鐘所觸發。舉例來說,遊戲可能會收到 FCM 訊息,要求更新部分資產。
如果您確定工作會在幾秒內完成,請使用非同步工作執行工作。即使應用程式處於背景,系統也會允許應用程式執行這類作業幾秒鐘。
如果工作需要的時間超過幾秒,建議您啟動前景服務來處理工作。事實上,如果工作是由使用者觸發,且屬於已核准的背景啟動限制豁免條件之一,即使應用程式目前處於背景,也可能會獲准啟動前景服務。舉例來說,如果應用程式收到高優先順序的 FCM 訊息,即使應用程式處於背景執行,也能啟動前景服務。
如果工作需要花費超過幾秒的時間,請使用工作排程 API。