背景工作總覽

應用程式經常需要一次執行多項操作。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 建立前景服務,詳情請參閱「支援長時間執行的 worker」。不過,請務必瞭解 WorkManager 建立的前景服務必須遵循與其他前景服務相同的所有限制。WorkManager 只是提供一些簡便的 API,可讓您更輕鬆地建立前景服務。

替代 API

系統會提供其他 API,這些 API 經過特別設計,執行效能較佳。如果您的用途有替代 API,建議使用該 API 而非前景服務,因為這有助應用程式提升效能。在前景服務類型說明文件中,有附註說明適合使用哪些替代 API,而不是特定前景服務類型。

以下列舉一些最常見的替代 API 使用情境:

使用者啟動的工作

顯示如何選擇適當 API 的流程圖。這張圖表總結了「使用者啟動的工作」一節的內容。
圖 1:如何選擇適當的 API 來執行使用者啟動的背景工作。

如果應用程式需要執行背景工作,且作業是由使用者在應用程式可見時啟動,請回答這些問題來找出合適的方法。

工作是否必須在背景執行時繼續執行?

如果工作不需要在應用程式於背景執行時繼續執行,則應使用非同步工作。有多種非同步工作的選項。請務必瞭解,當應用程式進入背景時,這些選項都會停止運作。(即使應用程式關閉,也會停止)。舉例來說,社群媒體應用程式可能想重新整理內容動態饋給,但如果使用者已離開畫面,就不需要完成作業。

如果工作延後或中斷,是否會有不良的使用者體驗?

請務必考量如果工作延後或取消,使用者體驗是否會受到影響。舉例來說,如果應用程式需要更新資產,使用者可能不會立即發現作業是立即執行,或是在裝置充電期間的半夜。在這種情況下,請使用「背景工作」選項。

該工作是簡短的關鍵任務嗎?

如果工作無法延遲且很快完成,您可以使用 shortService 類型的前景服務。這些服務比其他前景服務更容易建立,而且不需要過多的權限。不過,短時間服務必須在三分鐘內完成。

有沒有專為此用途提供的替代 API?

如果使用者看不到工作,正確的解決方案可能是使用前景服務。這些服務會在啟動後持續執行,因此中斷工作時,對使用者體驗可能會造成負面影響。舉例來說,健身追蹤應用程式可能會使用位置感應器,讓使用者在地圖上記錄自己的慢跑路線。我們不建議使用背景工作選項執行這項操作,因為如果工作處於暫停狀態,追蹤會立即停止。在這類情況下,前景服務最合理。

不過,由於前景服務可能會耗用大量裝置資源,因此系統會對這類資源的使用時機和方式施加許多限制。在許多情況下,您可以使用替代 API 來處理工作,避免使用前景服務。舉例來說,如果應用程式需要在使用者抵達特定位置時採取行動,最好的選項就是使用 geofence API,而非透過前景服務追蹤使用者的位置。

回應活動的工作

顯示如何選擇適當 API 的流程圖。這張圖表總結了「回應事件的工作」一節中的資料。
圖 2:如何選擇適當的 API 來執行事件觸發的背景工作。

有時應用程式需要執行背景工作才能回應觸發條件,例如:

這可能是外部觸發事件 (例如 FCM 訊息),也可能是應用程式本身設定的鬧鐘回應。例如,遊戲可能會收到 FCM 訊息,要求更新部分資產。

如果可以確保工作會在幾秒內完成,請使用非同步工作來執行這項工作。即使應用程式在背景執行,系統還是會允許應用程式執行數秒的時間。

如果工作需要超過幾秒的時間,建議您啟動前景服務來處理工作。事實上,即使應用程式目前在背景執行,但如果工作是由使用者觸發,且工作屬於核准的背景啟動限制的豁免項目,就可能允許啟動前景服務。舉例來說,如果應用程式收到高優先順序 FCM 訊息,則即使應用程式在背景執行,系統也允許啟動前景服務。

如果工作需時超過幾秒鐘,請使用工作排程 API