[譯] WorkManager 簡介

插圖來自 Virginia Poltrackhtml

Android 系統處理後臺工做有不少注意事項和最佳實踐,詳見 Google’s Power blog post series。其中一個反覆出現的調用是一個名爲 WorkManagerAndroid Jetpack 庫,它擴展了 JobScheduler 框架 API 的功能,並支持 Android 4.0+(API 14+)。WorkManager 測試版今天剛剛發佈!前端

這篇文章是 WorkManager 系列中的第一篇。咱們將探討 WorkManager 的基礎知識,如何以及什麼時候使用它,以及幕後發生了什麼。而後咱們將深刻研究更復雜的用例。android

WorkManager 是什麼?

WorkManager 是 Android 架構組件之一,也是 Android Jetpack 的一部分,是一個關於如何構建現代 Android 應用程序的新看法。ios

WorkManager 是一個 Android 庫,在知足工做的約束條件時運行可延遲的後臺工做。git

WorkManager 適用於須要保障的任務,即便應用程序退出,系統也會運行它們。github

換句話說,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 相關資源

感謝 Florina MuntBen WeissLyla Fujiwara.

若是發現譯文存在錯誤或其餘須要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可得到相應獎勵積分。文章開頭的 本文永久連接 即爲本文在 GitHub 上的 MarkDown 連接。


掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源爲 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索