應用程式通常需要同時執行多項作業。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 的一些常見情境:
- 使用使用者啟動的資料移轉功能,執行大型下載或上傳作業,而非建立資料同步前景服務
- 使用隨附裝置管理工具進行藍牙配對和資料移轉,而非使用連結裝置前景服務
- 使用子母畫面模式播放影片,而非建立媒體播放前景服務
由使用者啟動的工作
如果應用程式需要執行背景工作,且該作業是由使用者在應用程式顯示時啟動,請回答下列問題,找出適當的做法。
應用程式在背景執行時,是否需要繼續執行工作?
如果應用程式在背景執行時,工作不需要繼續執行,請使用非同步工作。執行非同步工作的方式有很多種。請務必瞭解,如果應用程式進入背景,這些選項都會停止運作。(如果應用程式關閉,也會停止)。舉例來說,社群媒體應用程式可能需要重新整理內容資訊提供,但如果使用者離開畫面,就不需要完成這項操作。
如果工作延遲或中斷,是否會造成不佳的使用者體驗?
請務必考量延遲或取消工作是否會損害使用者體驗。舉例來說,如果應用程式需要更新資產,使用者可能不會注意到作業是立即執行,還是在裝置充電時於深夜執行。在這種情況下,您應使用背景工作選項。
是否為短暫的重要工作?
如果工作無法延遲,且會快速完成,您可以使用類型為 shortService 的前景服務。這類服務比其他前景服務更容易建立,且不需要太多權限。不過,短服務必須在三分鐘內完成。
是否有專門用於此目的的替代 API?
如果使用者看得到工作,正確的解決方案可能是使用前景服務。這類服務啟動後會持續執行,因此如果中斷工作會導致使用者體驗不佳,這類服務就是理想選擇。舉例來說,健身追蹤應用程式可能會使用位置感應器,讓使用者在地圖上記錄慢跑路線。您不應使用背景工作選項執行這項操作,因為如果工作暫停,追蹤就會立即停止。在這種情況下,前景服務最為合適。
不過,前景服務可能會耗用大量裝置資源,因此系統對其使用時機和方式設下許多限制。在許多情況下,您可以使用替代 API 處理工作,不必使用前景服務,這樣更省事。舉例來說,如果應用程式需要在使用者抵達特定位置時採取行動,建議使用 Geofence API,而非透過前景服務追蹤使用者位置。
因應事件而執行的工作
有時,應用程式需要執行背景工作來回應觸發條件,例如:
- 廣播訊息
- Firebase 雲端通訊 (FCM) 訊息
- 應用程式設定的鬧鐘
這可能是外部觸發條件 (例如 FCM 訊息),也可能是為了回應應用程式本身設定的鬧鐘。舉例來說,遊戲可能會收到 FCM 訊息,指示更新某些素材資源。
如果您確定工作會在幾秒內完成,請使用非同步工作執行工作。系統會允許應用程式在幾秒內執行這類工作,即使應用程式在背景執行也一樣。
如果工作需要幾秒鐘以上才能完成,建議您啟動前景服務來處理工作。事實上,即使應用程式目前在背景執行,只要工作是由使用者觸發,且符合背景啟動限制的核准豁免條件,系統仍可能允許啟動前景服務。舉例來說,如果應用程式收到高優先順序的 FCM 訊息,即使應用程式在背景執行,也允許啟動前景服務。
如果工作需要超過幾秒鐘的時間,請使用工作排程 API。