背景工作總覽

應用程式經常需要同時執行多項作業,Android API 提供多種做法。選擇正確的選項非常重要,您的做法也許適用於某種情況,但在另一個情況中也不適用。選擇錯誤的 API 可能會對應用程式的效能或資源效率造成負面影響,導致應用程式消耗電量並降低使用者裝置的整體效能。在某些情況下,如果選擇錯誤的方法,可能會導致您的應用程式無法列入 Play 商店。

本文件將說明可用的不同選項,協助您根據自身情況選擇合適的選項。

術語

部分與背景工作相關的重要字詞可能會以多個牴觸的方式使用。因此,我們必須定義這些字詞。

如果應用程式在背景執行,系統會對應用程式設下多項限制。(例如,在大多數情況下,背景應用程式無法啟動前景服務)。

為配合本文件,我們會使用「工作」一詞,代表應用程式在主要工作流程之外執行的作業。為確保理解一致,我們將這三種工作分為三大類:非同步工作背景工作前景服務

選擇合適的選項

在大部分情況下,只要確認工作所屬的類別 (非同步工作背景工作前景服務),即可確定工作適用的 API。

如果還是不確定,可以使用我們提供的流程圖,為決策增添更多細微之處。本文稍後將詳細說明上述每個選項。

背景工作主要要考量兩種情況:

這兩種情境各有專屬的決策樹狀圖。

非同步工作

在許多情況下,應用程式在前景執行時,只需要執行並行作業。舉例來說,應用程式可能需要進行耗時的計算。如果系統在 UI 執行緒中執行計算作業,使用者必須等到計算作業完成才能與應用程式互動,這可能會造成 ANR 錯誤。在這種情況下,應用程式應使用「非同步工作」選項。

常見的非同步工作選項包括 Kotlin 協同程式和 Java 執行緒,詳情請參閱非同步工作說明文件。請注意,與背景工作不同的是,如果應用程式停止在有效的生命週期階段 (例如應用程式離開前景),非同步工作並不保證會完成。

背景作業

如果您需要執行這些作業,即使使用者離開應用程式也能繼續作業,背景工作是較靈活的選項。在大多數情況下,背景工作的最佳選項就是使用 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 的流程圖。這張圖表概述「使用者啟動的工作」一節的內容。
圖 1:如何選擇合適的 API 來執行使用者啟動的背景工作。

如果應用程式需要執行背景工作,且這項作業是由使用者在應用程式顯示期間啟動,請回答這些問題來找出正確的做法。

應用程式是否需要在背景執行時繼續執行?

如果應用程式在背景執行時,工作不需要繼續執行,建議您使用非同步工作。執行非同步工作的方法有很多種。請特別注意,如果應用程式進入背景,這些選項全都會停止運作。(如果應用程式關閉,它們也會停止)。舉例來說,社群媒體應用程式可能會想重新整理內容動態消息,但在使用者離開螢幕時,就無需完成操作。

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

請務必考量如果工作延後或取消,系統就不會對使用者體驗造成任何影響。舉例來說,如果應用程式需要更新其資產,使用者可能不會發現作業是立即執行,或是在裝置充電時處於中間階段。在這種情況下,您應使用「背景工作」選項。

這是簡短的重要工作嗎?

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

是否有專為這個用途提供的替代 API?

如果使用者無法看見工作,則可以使用前景服務。這些服務在啟動後會持續執行,因此在中斷工作時就會帶來不良使用者體驗。舉例來說,健身追蹤應用程式可能會使用位置感應器,讓使用者在地圖上記錄自己的慢跑路線。我們不建議使用背景工作選項執行這項操作,因為如果工作暫停,追蹤會立即停止。在這類情況下,前景服務最合理。

不過,由於前景服務可能會使用大量裝置資源,因此系統會針對使用時機和方式設下許多限制。在許多情況下,與其使用前景服務,您可以使用替代 API 來處理工作,這樣較不容易發生問題。舉例來說,如果應用程式需要在使用者抵達特定位置時執行動作,最好的做法是使用 geofence API,而不是透過前景服務追蹤使用者的位置。

活動回應工作

顯示如何選擇適當 API 的流程圖。這張圖表概述「回應事件的工作」一節的內容。
圖 2:如何選擇合適的 API 來執行事件觸發的背景工作。

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

這可能是外部觸發條件 (例如 FCM 訊息),或是回應應用程式本身設定的鬧鐘。例如,遊戲可能會收到 FCM 訊息,通知遊戲更新某些資產。

如果您確定工作會在幾秒內完成,請使用非同步工作來執行工作。即使應用程式在背景執行,系統仍允許應用程式執行這類工作。

如果工作時間超過幾秒鐘,則可能適合啟動前景服務來處理工作。事實上,即使應用程式目前在背景運作,只要工作是由使用者觸發,且符合任一背景啟動限制的豁免條件,系統還是可以允許啟動前景服務。舉例來說,如果應用程式收到高優先順序 FCM 訊息,即使應用程式在背景執行,也可以啟動前景服務。

如果工作所需時間超過幾秒鐘,請使用「背景工作」