- 原文地址:Introducing WorkManager
- 原文作者:Pietro Maggi
- 譯文出自:掘金翻譯計劃
- 本文永久連結:github.com/xitu/gold-m…
- 譯者:Rickon
- 校對者:DevMcryYu
插圖來自 Virginia Poltrack
Android 系統處理後臺工作有很多注意事項和最佳實踐,詳見 Google’s Power blog post series。其中一個反覆出現的呼叫是一個名為 WorkManager 的 Android Jetpack 庫,它擴充套件了 JobScheduler 框架 API 的功能,並支援 Android 4.0+(API 14+)。WorkManager 測試版今天剛剛釋出!
這篇文章是 WorkManager 系列中的第一篇。我們將探討 WorkManager 的基礎知識,如何以及何時使用它,以及幕後發生了什麼。然後我們將深入研究更復雜的用例。
WorkManager 是什麼?
WorkManager 是 Android 架構元件之一,也是 Android Jetpack 的一部分,是一個關於如何構建現代 Android 應用程式的新見解。
WorkManager 是一個 Android 庫,在滿足工作的約束條件時執行可延遲的後臺工作。
WorkManager 適用於需要保障的任務,即使應用程式退出,系統也會執行它們。
換句話說,WorkManager 提供了一個電池友好的 API,它封裝了 Android 後臺行為限制多年來的演變。這對於需要執行後臺任務的 Android 應用程式至關重要!
什麼時候使用 WorkManager
無論應用程式程式是否存在,WorkManager 都會處理在滿足各種約束條件時需要執行的後臺工作。後臺工作可以在應用程式位於後臺、前臺或者應用在前臺開啟即將轉到後臺的時候啟動。無論應用程式在做什麼,後臺工作都應該繼續進行,或者在 Android 終止其程式時重啟其後臺工作。
關於 WorkManager 的一個常見誤解是它需要在“後臺”執行緒中執行,但不需要在程式死亡時存活。事實並非如此。這種用例還有其他解決方案,如 Kotlin 的協程,ThreadPools 或 RxJava 等庫。你可以在後臺處理指南中找到有關此用例的更多資訊。
有許多不同的情況下,你需要執行後臺工作,因此需要使用不同的解決方案來執行後臺工作。這篇關於後臺執行的部落格文章提供了很多關於何時使用 Workmanager 的有用資訊。請看部落格中的此圖表:
圖解來自 Android 中的現代後臺執行
對於 WorkManager,最適合處理的是必須完成並且可以延遲的後臺工作。
首先,問問你自己:
-
這個任務需要完成嗎? 如果應用程式被使用者關閉了,是否仍需要完成任務?一個例子是帶有遠端同步的筆記應用程式;每次你寫完一個筆記,你就會期望該應用程式將你的筆記與後端伺服器同步。即使您切換到另一個應用程式並且作業系統需要關閉應用程式以回收一些記憶體。即使重新啟動裝置也會發生這種情況。WorkManager 能夠確保任務完成。
-
這個任務可以延遲嗎? 我們可以稍後執行任務,還是隻在現在執行才可以用?如果任務可以稍後執行,那麼它是可延遲的。回到前面的例子,立即同步你的筆記會很好,但是如果不能立即同步而是稍後進行的話也沒什麼大問題。WorkManager 尊重作業系統後臺限制,並嘗試以電池高效的方式執行你的工作。
因此,作為指導原則,WorkManager 適用於需要確保系統將執行它們的任務,即使應用程式退出也是如此。它不適用於需要立即執行或需要在確切時間執行的後臺工作。如果你需要在準確的時間執行工作(例如鬧鐘或事件提醒),請使用 AlarmManager。對於需要立即執行但長時間執行的工作,你通常需要確保在前臺執行工作;是否通過限制執行到前臺(在這種情況下工作不再是真正的後臺工作)或使用前臺服務。
當你需要在更復雜的場景中觸發一些後臺工作時,WorkManager 可以並且應該與其他 API 配對使用:
- 如果你的伺服器觸發了工作,WorkManager 可以與 Firebase Cloud Messaging 配對使用。
- 如果你正在使用廣播接收器監聽廣播,然後需要觸發長時間執行的工作,那麼你可以使用 WorkManager。請注意,WorkManager 支援許多通常作為廣播傳播的常見 Constraints — 在這些情況下,你不需要註冊自己的廣播接收器。
為什麼要用 WorkManager?
WorkManager 執行後臺工作,同時能夠為你處理電池和系統健康的相容性問題和最佳實踐。
此外,你可以使用 WorkManager 安排定時任務和複雜的從屬任務鏈:後臺工作可以並行或順序執行,你可以在其中指定執行順序。WorkManager 無縫地處理任務之間的輸入和輸出傳遞。
你還可以設定後臺任務執行時間的標準。例如,如果裝置沒有網路連線,則沒有理由向遠端伺服器發出 HTTP 請求。因此,您可以設定約束條件,該任務只能在網路連線時執行。
作為保證執行的一部分,WorkManager 負責在裝置或應用程式重啟時保持工作。你也可以輕鬆地定義重試策略如果你的工作已停止並且您想稍後重試。
最後,WorkManager 允許你觀察工作請求的狀態,以便你可以更新 UI。
總而言之,WorkManager 提供了以下好處:
- 處理不同系統版本的相容性
- 遵循系統健康最佳實踐
- 支援非同步一次性和週期性任務
- 支援帶輸入/輸出的鏈式任務
- 允許你設定在任務執行時的約束
- 即使應用程式或裝置重啟,也可以保證任務執行
讓我們看一個具體的例子,我們構建一個將過濾器應用於影象的併發任務管道。然後將結果傳送到壓縮任務,然後傳送到上傳任務。
我們可以為這些任務定義一組約束,並指定何時可以執行它們:
帶有約束的任務鏈示例
所有這些 workers 都定義了一個精確的序列:我們不知道過濾影象的順序,但我們知道只有在所有過濾器工作完成後,Compress 工作才會啟動。
WorkManager 排程程式的工作原理
為了確保相容性達到 API 14 級別,WorkManager 根據裝置 API 級別選擇適當的方式來安排後臺任務。WorkManager 可能使用 JobScheduler 或 BroadcastReceiver 和 AlarmManager 的組合。
WorkManager 如何確定要使用的排程程式
WorkManager 準備好用於生產了嗎?
WorkManager 現在處於測試階段。這意味著在此主要修訂版中不會有重大的 API 變更。
當 WorkManager 穩定版本釋出時,它將是執行後臺任務的首選方式。 因此,這是開始使用 WorkManager 並幫助改進它的好時機!
感謝 Lyla Fujiwara。
WorkManager 相關資源
- 官方文件
- Reference guide
- WorkManager 1.0.0-beta01 Release notes
- Codelab
- 原始碼 (part of AOSP)
- IssueTracker
- StackOverflow 網站上的 WorkManager 相關問題
- Google’s Power blog post series
感謝 Florina Munt、Ben Weiss 和 Lyla Fujiwara.
如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。