背景作業總覽

建立 Android 應用程式時,在背景處理資料是相當重要的一環,因為這能同時讓使用者和 Android 平台上的優良公民產生回應。在主要執行緒上執行作業會導致效能不佳,進而對使用者體驗造成負面影響。

本指南說明背景工作的定義、定義背景工作類別、提供將工作分類的條件,以及建議您應用於執行這些工作的 API。

核心原則

一般來說,您應移除 UI 執行緒的所有封鎖工作。常見的長時間執行工作包括解碼點陣圖、存取儲存空間、處理機器學習 (ML) 模型或執行網路要求等。

背景工作的定義

如果同時符合以下兩項條件,應用程式就會在「背景」執行:

  • 目前使用者看不到應用程式的任何活動。
  • 應用程式並未執行任何在使用者看到應用程式活動時啟動的前景服務

否則,該應用程式會在前景執行。

常見的背景工作類型

背景作業可分為以下三種主要類別:

  • 立即執行:必須立即執行並盡快完成。
  • 長時間執行:可能需要一段時間才能完成。
  • 可延遲:不需要立即執行。

同樣地,以下三種類別的背景作業可以是永久性或非永久性:

  • 持續性工作:繼續進行透過應用程式重新啟動和裝置重新啟動排程。
  • 永久性作業:程序結束後,您不再排定工作。
圖 1:背景工作類型。

您應採取不同做法,要提供不持續性或持續性的運作方式:

  • 所有持續性作業:您應針對所有形式的永久性工作使用 WorkManager
  • 立即影響不間斷的作業:您應使用 Kotlin 協同程式立即執行不永久性的作業。如果您是 Java 程式設計語言使用者,請參閱執行緒指南,瞭解我們建議的選項。
  • 長時間執行且不可延遲的工作:您不應使用長時間執行且不可延遲的工作。請改用 WorkManager 透過持續性作業來完成這類工作。

下表說明各種背景工作適用的方法。

類別 永久 永久性
立即 WorkManager 協同程式
長時間執行 WorkManager 不建議採用。請改用 WorkManager 持續執行工作。
延遲 WorkManager 不建議採用。請改用 WorkManager 持續執行工作。

立即處理

「立即執行」作業包含必須立即執行的工作。這些是使用者重視的工作,否則您日後無法安排延遲執行的工作。這兩者非常重要,因此即使應用程式關閉或裝置重新啟動,可能仍需保持排定的提示執行。

建議解決方法

如要執行持續性作業,您應將 WorkManager 與 OneTimeWorkRequest 搭配使用。使用 setExpedited() 加速 WorkRequest。

如要執行持續性作業,建議您使用 Kotlin 協同程式。如果應用程式使用 Java 程式設計語言,則應使用 RxJavaGuava。您也可以使用 Executors

範例

  • 應用程式需要從資料來源載入資料。然而,在主執行緒上發出這類要求會封鎖要求,並導致 UI 資源浪費。應用程式會改為從協同程式的主執行緒發出要求。
  • 應用程式必須在即時通訊應用程式中傳送訊息。應用程式會建立 Worker,並將工作排入 WorkRequest 的佇列。而是使用 setExpedited()「加速」WorkRequest

長時間執行的工作

如果工作可能需要超過 10 分鐘才能完成,就會長時間執行

建議解決方法

WorkManager 可讓您使用長時間執行的 Worker 處理這類工作。

範例

應用程式需要下載一個無法分群的大型檔案。這項操作會建立長時間執行的 Worker,並將下載排入佇列。然後應用程式會在超過十五分鐘的背景中下載檔案。

可延後的工作

任何不需要立即執行的工作都屬於可延遲的工作。

建議解決方法

如果處理的工作無須立即執行,但在應用程式關閉或裝置重新啟動時需要保持排程,使用 WorkManager 安排延遲工作是最佳方式。

範例

應用程式需要定期與後端同步資料。使用者不會觸發同步處理,且工作應會在裝置處於閒置狀態時進行。建議做法是針對下列情境使用搭配自訂 Worker 和限制的 PeriodicWorkRequest

鬧鐘

鬧鐘是特殊用途,不屬於背景作業的一部分。您應透過上述兩個解決方案 (協同程式和 WorkManager) 執行背景工作。

您「只」應使用 AlarmManager 設定精確鬧鐘,例如鬧鐘或日曆活動。使用 AlarmManager 排定背景作業時,會從打盹模式喚醒裝置,且使用時可能會對電池續航力和整體系統健康狀態產生負面影響。您的應用程式必須為這類影響負責。

取代前景服務

Android 12 會限制從背景啟動前景服務。在大多數情況下,您應使用 WorkManager 提供的 setForeground(),而不要自行處理前景服務。這樣一來,WorkManager 就能管理前景服務的生命週期,確保效率。

您仍應使用前景服務執行長時間執行的工作,且需要通知使用者執行中的工作。如果您直接使用前景服務,請務必正確關閉服務,以維持資源效率。

直接使用前景服務的某些用途如下:

  • 媒體播放
  • 活動追蹤
  • 位置資訊分享
  • 語音或視訊通話