Android JetPack 簡介及 Work Manager 和 Navigation 組件詳述 | Google 開發者大會

在 Android 誕生的第十個年頭,Android 手機應用的開發應該變得更加快捷。Google 也一直在聆聽開發者的心聲,盡力的提升開發者在開發 Android 應用的效率。在去年,咱們聽到開發者說,Android 開發的生命週期管理很困難,因此咱們推出了 lifecycle 組件。咱們還聽到,當你對後臺任務進行處理的時候,API 給你了5-6種不一樣的解決方法,那麼哪種纔是你最該使用的呢?爲了解決這些問題,Android JetPack 誕生了。android

咱們但願 JetPack 不只可以提供各類功能的 API,同時,也但願給各位開發者在開發移動應用的時候能夠有一個能夠依照的藍圖。安全

Android JetPack是什麼以及其組成部分

什麼是 Android JetPack?Android JetPack 是一套組件、工具和架構指南,咱們將現有的 support library 和架構組件聯繫起來。一下子大家就將看到,這些架構和組件,都是大家很是熟悉和正在使用的。網絡

Android JetPack 由四個部分組成,分別是架構、界面、基礎和行爲,每一個部分的具體組成部分請查看下圖架構

去年咱們推出的架構組件,在開發者心中得到一致好評,架構組件的優勢是,你能夠經過使用一個或者幾個架構組件,來解決你在開發過程當中遇到的問題。在去年的基礎上,今天咱們又推出的新的架構組件,分別是:WorkManager、Navigation、Paging。Paging 已經達到穩定版本,WorkManager 和 Navigation 還處在阿爾法的階段。ide

JetPack 的第二部分是行爲,行爲種的大部分組件包含了你們都很是熟悉的組件,例如 Download Manager 能夠進行大數據的下載,Media&Playback 和Permissions 能夠幫助你們在音視頻的處理和獲取權限,Notifications 是對推送的處理。這些組件有一個通用的特色:他們都是向後兼容的。模塊化

行爲中,咱們還加入了一個新的組件:Slices。Slices 提供給應用的一個新的數據遍歷的方式,如今 Slices 已經在 Google Assistant 和 Google Search 中有所體現了。函數

JetPack 的下一個部分是界面,其中包括 Fragment、Layout、Palette、Animation&Transitions、Auto.TV & Wear、Emoji 等部分。咱們但願界面部分不但可以讓界面更加好看,同時也但願可以給用戶帶來好的用戶體驗。工具

JetPack 的最後一個部分是基礎,就像他的名字的同樣,它是你們在應用開發過程當中必不可少的一部分。咱們推出了 Kotlin Extensions(KTX)、經過利用 Kotlin 語言自身的特性,例如:擴展函數、屬性等,KTX 能夠幫助你們更好的寫出簡潔的 Kotlin 代碼。AppCompat 是你們都很熟悉的向後兼容庫,以前 v4 和 v7 在你們的開發過程當中帶來了不小的麻煩,因此咱們對它進行了封裝,推出了 androidx,你們能夠經過使用 Android Studio3.2 來使用 androidx測試

架構組件

去年,咱們推出了一套架構指南,而且有一套組件來完成這個架構指南,經過使用架構組件,可使你的應用變得更加模塊化和易於測試和維護。架構組件的宗旨是:讓 Android 開發更簡單。大數據

在去年的 GDD 上 ,咱們想你們介紹來4個穩定版本的架構組件他們分別是:Lifecycles、LifeData、Room 以及 ViewModel。就像下圖中展現的,界面組件負責顯示 UI 界面,ViewModel 負責處理 UI 數據,你可使用 LiveData 來更新數據進而更新 UI 界面。Respository 是一個惟一的數據層結構,你可使用 Room 來進行數據持久化。

在這一基礎上,咱們還推出來 Paging,它能夠幫你在 recyclerview 中更好的夾在分頁數據。Paging 庫已經達到的穩定版本。

接下來,咱們來看一下處理阿爾法階段的兩個庫,Navigation。 當用戶在使用你的應用時,就像下圖中的同樣,是你爲用戶設計來一個個的目的地。而且引導用戶在這些目的地中瀏覽。咱們爲導航列出來這幾個必須遵循的原則:

  • 須要有一個共同的其實目的地
  • 導航的狀態須要一個棧來表明的(後進先出)
  • 系統和應用的向上和返回按鈕因該爲用戶提供統一的體驗
  • 很好的支持 DeepLink

讓咱們來看一下 Deep Link 的例子(如上圖),在這個應用程序當中,從首頁到類別到內容,一步一步的到了這樣的一個頁面,固然,你的用戶也可能經過一個url直接來到這個界面。當你作爲一個開發者,爲了給用戶提供這樣的一個一致可預測的體驗,你須要怎麼作呢?,你須要對回退棧作統一。開發者在解決這個問題的時候,要麼是本身把導航庫的邏輯本身完成了,要麼是本身寫了不少代碼去實現這個功能,可是代碼不易於維護。而且是容易出錯的。

Navigation 就是爲了解決這樣的問題出現的。Navigation 成功的解決了如下問題:

  • 處理 Fragment Transactions
  • 處理‘向上’和‘返回’
  • 支持 Deep Link
  • 提供動畫,跳轉效果

Navigation 在 Android Studio 中提供了一個可視化的導航編輯界面, 這個可視化的界面是一個xml文件,下圖是一個xml文件的例子。

咱們說,Acitivty 將會做爲 Navigation 的一個切入點,讓 Fragment 成爲內容的載體。Activity 只是負責一個所有的導航,二中間的部分咱們是交給一個 NavHost 託管的。

具體是實現導航跳轉是使用 NavController 實現的,爲了獲取 NavController 咱們爲你們提供了下面三個方法

若是你要經過一個按鈕來跳轉一個界面,咱們爲你們提供來一個方便的方法 createNavigateOnClickListener,若是你不想用這個方法,咱們還提供來另一種方法來實現,參照下圖

關於 Navigation 的跳轉動畫,你能夠參考下圖:

在導航的時候,咱們常常須要傳遞參數,但傳遞參數咱們常常須要考慮的一個問題是:咱們沒法確保類型的安全。因此 Navigation 提供來一個插件 Safe Args。

一個常見的 DeepLink 類型,一般是一個通知、Shortcuts、Widget、Action 或者 Slices,咱們爲這些 DeepLink 提供了一個方法叫作 NavDeepLinkBuilder。關於 NavDeepLinkBuilder 的使用方法,能夠參考下圖:

另一些 DeepLink,例如:URL 或者自定義的 Scheme URIs,咱們須要在 Navigation 圖中加入<deepLink>標籤

因爲時間關係,咱們沒法一一介紹 Navigation 的全部方法,因此,咱們建議開發者在會後能夠親自體驗一下 Navigation

WorkManager

在 Android 開發過程當中的另一部分對於用戶來講是很是重要的,可是也是咱們看不見摸不着的,那就是後臺運行。

從最開始,咱們爲你們提供了 Background Services、AlarmManager,到 API 21 以後,咱們爲你們提供了 Jobs,對於使用 Google Play 服務的應用,咱們又提供了 Firebase Job Dispatcher 和 GcmNetWorkManager。上圖中顯示了應用市場中各個 Android 系統的版本分佈。你爲了覆蓋市場上的這些機型,你可能須要寫一段很長的 if 和 else 代碼來判斷設備的狀況,來選擇合理的 API。

說到來後臺運行,就不得不提設備電量的問題。在使用 Background Services 的時候,應用常常在後臺自行運行,從而形成設備電量快速消耗。爲了解決這個問題,Android 系統在最近的幾個版本中陸續推出來減小設備電量消耗的功能,詳細狀況請參考下圖:

目前,關於後臺運行的 API,咱們選出如下下幾個:

那麼在上圖中的幾個 API 當中,咱們應該首選哪個呢?答案是 WorkManager。

WorkManager 是一個 API,它簡單到只須要一個 dowork() 這樣的操做,就能夠很好的控制後臺程序的運行。同時,它支持向後兼容。不管你在應用中是否使用 Google Play 服務,你均可以使用過 WorkManager。

舉個例子,例如咱們要上傳一張照片,下圖中是我在上傳照片中使用的 WorkManager API

針對上傳圖片這個操做,咱們來看一看怎麼寫:

在這個任務裏,咱們 override 的一個doWork方法,doWork 方法會在後臺運行哦,任務上傳成功與否,咱們在 doWork 方法裏返回。

在建立好一個任務以後,咱們還須要建立一個任務請求:

若是咱們在上傳圖片的過程當中沒有網絡怎麼辦?這就須要咱們在建立任務的時候添加一個約束條件:

怎樣肯定照片是否上傳成功?在這裏咱們可使用 LiveData 來觀察任務狀態:

剛放給你們介紹來一個新的類叫 WorkStatus,它又兩個方法,一個是 getId,一個是 getState

若是咱們想在上傳照片以前先壓縮,WorkManager 也提供來幾個這樣的方法,你能夠順序的執行或者同步執行這樣的幾個任務。

首先,咱們先建立一個壓縮任務,在壓縮任務以後再建立一個上傳任務,而後使用 beginWith 和 then 把剛纔的兩個任務依次加羣進去,就能夠完成這個任務了。

若是說我想上傳多張圖片該怎麼作呢? WorkManager 也爲你們提供了一個方法來作這件事情,你們能夠依次調用 enqueue 這個方法,把多個任務請求依次加入到這個方法中就能夠了。

當咱們須要選擇一張圖片來進行上傳的時候,須要輸入一個 URI,咱們在進行這個任務的時候,須要一個輸入值,在 WorkManager 中,提供來一個 Data 用做這個輸入值,關於這個 Data 的相關介紹,請看下圖:

首先,咱們給咱們的須要上傳圖片的 URL 一個作一個 bundle,而後把它傳入到咱們的任務請求當中:

而後獲取以前存入的參數,進而得到須要壓縮圖片的圖片地址,而後把壓縮圖片的地址存起來:

咱們把這兩個任務串起來,就是一個這樣的 WorkManager 任務鏈:

怎樣取消上傳?取消上傳,你可使用 cancelWorkById,可是咱們不建議你使用 id 做爲任務取消時的標籤。

咱們建議你們使用 Tags 來對你的任務進行標記:

而後,咱們使用 getStatusByTag 來得到 Tag 的任務或者取消任務。

在後臺任務中,還又一個很是重要的功能,就是同步,同步又一個特色,就是咱們不但願在同一個時間有多個同步任務。

爲了實現這個的效果,咱們爲你們提供了 UniqueWork 這個方法:

具體實現的原理以下:

目前 WorkManager 也處於阿爾法階段,歡迎你們在會後使用 WorkManager。

這裏有一些關於 Androd JetPack、Navigation 和 WorkManager 的一些資源,歡迎你們在會後進行訪問。

謝謝你們!

我去推特粉一下這個小姐姐😁。

相關文章
相關標籤/搜索