使用 WorkManager 安排工作執行時間Android Jetpack 的一部分。
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
WorkManager 為持續性作業的推薦解決方案。當透過應用程式和系統重新啟動已排定的作業時,作業仍持續存在。由於大多數的背景處理都是透過持續性作業完成的,因此 WorkManager 是用於背景處理的首推 API。
持續性作業的類型
WorkManager 會處理三種類型的持續性作業:
- 立即執行:工作必須立即開始並盡速完成。可能會加速。
- 長時間執行:長時間執行的工作,執行時間可能會超過 10 分鐘。
- 可延後執行:已排定的週期性工作,於日後啟動,且可定期執行。
圖 1 概略說明不同類型的持續性作業之間的關係。
同樣地,下表概述了各種作業類型。
類型 | 週期 | 存取方式 |
---|---|---|
立即 | 一次性 | OneTimeWorkRequest 和 Worker 。
如要提高工作效率,請在 OneTimeWorkRequest 中呼叫 |
長時間執行 | 一次性或定期 | 任何 WorkRequest 或 Worker 。呼叫工作站中的 setForeground() 以處理通知。 |
可延後 | 一次性或定期 | PeriodicWorkRequest 和 Worker 。 |
如要進一步瞭解如何設定 WorkManager,請參閱「定義您的 WorkRequest」指南。
功能
除了提供更簡便且一致的 API 外,WorkManager 還具備幾項重要優勢:
作業限制條件
使用作業限制條件,藉此定義執行作業的最佳條件。舉例來說,裝置在非計量付費網路、裝置處於閒置狀態或電量充足時,才會執行應用程式。
完善的時間安排
WorkManager 可讓您安排作業,讓您透過彈性的可預約時間範圍執行一次性或重複的作業。您也可以標記作業並為其命名,以便排定不重複的替換作業,並監控或取消一組作業。
排程作業會儲存在內部管理的 SQLite 資料庫中,WorkManager 會確保這項工作持續執行,並在裝置重新啟動時重新安排。
此外,WorkManager 遵循節能功能與最佳做法 (例如 Doze 模式),因此不必擔心這一點。
急件作業
您可以使用 WorkManager 排定立即在背景執行的工作。針對對使用者重視且需在幾分鐘內完成的工作,您應使用「急件作業」。
靈活的重試政策
有時作業失敗。WorkManager 提供靈活的重試政策,包括可設定的指數輪詢政策。
作業鏈
針對複雜的相關作業,請使用直覺式介面將個別作業工作串連在一起,藉此控制哪些元件要依序執行和哪些元件要平行執行。
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)
}
)
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 (包括 FirebaseJobDispatcher、GcmNetworkManager 和 Job Scheduler) 以 WorkManager API 取代。
開始
請參閱「入門指南」,瞭解如何在應用程式中開始使用 WorkManager。
其他資源
如要進一步瞭解 WorkManager
,請參閱下列資源。
範例
Learn how this app was designed and built in the design case study, architecture learning journey and modularization learning journey.
This is the repository for the Now in Android app. It is a work in progress 🚧.
Now in Android is a fully functionalNow in Android App
影片
- Workmanager - MAD Skills (影片系列)
- 與 WorkManager 合作,2018 年 Android 開發人員高峰會
- WorkManager:超越基礎,2019 年 Android 開發人員高峰會
網誌
為你推薦
應用程式啟動
Discover the latest app development tools, platform updates, training, and documentation for developers across every Android device.