使用 WorkManager 安排工作執行時間Android Jetpack 的一部分

WorkManager 為持續性作業的推薦解決方案。當透過應用程式和系統重新啟動已排定的作業時,作業仍持續存在。由於大多數的背景處理都是透過持續性作業完成的,因此 WorkManager 是用於背景處理的首推 API。

持續性作業的類型

WorkManager 會處理三種類型的持續性作業:

  • 立即執行:工作必須立即開始並盡速完成。可能會加速。
  • 長時間執行:長時間執行的工作,執行時間可能會超過 10 分鐘。
  • 可延後執行:已排定的週期性工作,於日後啟動,且可定期執行。

圖 1 概略說明不同類型的持續性作業之間的關係。

持續性作業可以立即執行、長時間執行或可延後執行
圖 1:持續性作業的類型。

同樣地,下表概述了各種作業類型。

類型 週期 存取方式
立即 一次性 OneTimeWorkRequestWorker

如要提高工作效率,請在 OneTimeWorkRequest 中呼叫 setExpedited()

長時間執行 一次性或定期 任何 WorkRequestWorker。呼叫工作站中的 setForeground() 以處理通知。
可延後 一次性或定期 PeriodicWorkRequestWorker

如要進一步瞭解如何設定 WorkManager,請參閱「定義您的 WorkRequest」指南。

功能

除了提供更簡便且一致的 API 外,WorkManager 還具備幾項重要優勢:

作業限制條件

使用作業限制條件,藉此定義執行作業的最佳條件。舉例來說,裝置在非計量付費網路、裝置處於閒置狀態或電量充足時,才會執行應用程式。

完善的時間安排

WorkManager 可讓您安排作業,讓您透過彈性的可預約時間範圍執行一次性重複的作業。您也可以標記作業並為其命名,以便排定不重複的替換作業,並監控或取消一組作業。

排程作業會儲存在內部管理的 SQLite 資料庫中,WorkManager 會確保這項工作持續執行,並在裝置重新啟動時重新安排。

此外,WorkManager 遵循節能功能與最佳做法 (例如 Doze 模式),因此不必擔心這一點。

急件作業

您可以使用 WorkManager 排定立即在背景執行的工作。針對對使用者重視且需在幾分鐘內完成的工作,您應使用「急件作業」。

靈活的重試政策

有時作業失敗。WorkManager 提供靈活的重試政策,包括可設定的指數輪詢政策

作業鏈

針對複雜的相關作業,請使用直覺式介面將個別作業工作串連在一起,藉此控制哪些元件要依序執行和哪些元件要平行執行。

Kotlin


val continuation = WorkManager.getInstance(context)
    .beginUniqueWork(
        Constants.IMAGE_MANIPULATION_WORK_NAME,
        ExistingWorkPolicy.REPLACE,
        OneTimeWorkRequest.from(CleanupWorker::class.java)
    ).then(OneTimeWorkRequest.from(WaterColorFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(GrayScaleFilterWorker::class.java))
    .then(OneTimeWorkRequest.from(BlurEffectFilterWorker::class.java))
    .then(
        if (save) {
            workRequest<SaveImageToGalleryWorker>(tag = Constants.TAG_OUTPUT)
        } else /* upload */ {
            workRequest<UploadWorker>(tag = Constants.TAG_OUTPUT)
        }
    )

Java


WorkManager.getInstance(...)
.beginWith(Arrays.asList(workA, workB))
.then(workC)
.enqueue();

您可以針對每項作業工作定義輸入和輸出資料。將作業鏈結在一起時,WorkManager 會自動將一項作業工作中的輸出資料傳遞至下一個作頁工作。

內建執行緒互通性

WorkManager 完美整合協同程式RxJava,並提供插入自己非同步 API 的靈活性。

使用 WorkManager 執行可靠的作業

WorkManager 重點在協助使用者順暢執行要求的作業,即使使用者離開畫面、應用程式退出或裝置重新啟動也一樣。舉例來說:

  • 將記錄檔或數據分析傳送至後端服務。
  • 定期將應用程式資料與伺服器同步。

WorkManager 不適用於執行中的背景作業,可在應用程式程序離開時安全地終止。這也不是所有需要立即執行作業的通用解決方案。請參閱背景處理指南,瞭解哪一種解決方案符合您的需求。

與其他 API 的關係

雖然針對特定用途建議使用協同程式解決方案,但我們不建議您將其用於持續性作業。請特別注意,協同程式是並行架構,而 WorkManager 是持續性作業的程式庫。同樣地,AlarmManager 只能用於時鐘或日曆。

API 推薦學習對象 與 WorkManager 的關係
協同程式 所有非同步的作業都不需持續維護。 協同程式是指在 Kotlin 中離開主執行緒的標準方法。但應用程式關閉後,就會留下記憶體。針對持續性作業,請使用 WorkManager。
AlarmManager 僅限鬧鐘 與 WorkManager 不同的是,AlarmManager 會以 Doze 模式喚醒裝置。因此在電源和資源管理方面的效率不高。這項設定只適用於確切的鬧鐘或通知 (例如日曆活動),而非背景作業。

更換已淘汰的 API

我們建議所有先前的 Android 背景排程 API (包括 FirebaseJobDispatcherGcmNetworkManagerJob Scheduler) 以 WorkManager API 取代。

開始

請參閱「入門指南」,瞭解如何在應用程式中開始使用 WorkManager。

其他資源

如要進一步瞭解 WorkManager,請參閱下列資源。

範例

影片

網誌