根據咱們曾經作的調查,開發者們但願 Android 官方能夠維護一些實用的組件庫和架構實踐,以下降中大型應用的開發門檻,這樣開發團隊就能夠集中更多精力在實際業務的優化和改進上。html
Jetpack 項目正是爲了解決這些問題而誕生的,Jetpack 是一系列助力您更容易打造優秀 Android 應用的工具和組件,這些組件能幫助您遵循最佳實踐、免除編寫繁複的樣板代碼並簡化複雜任務,從而使您能夠專一於最核心的代碼邏輯。其中 androidx.* 庫與 Framework API 解耦,這可以提供向後兼容的同時,也能更頻繁地更新。java
Android Jetpack 中的架構組件可幫助您設計穩健、可測試且易維護的應用。從最初發布的管理 Activity 和 Fragment 生命週期的Lifecycle 庫和訪問 SQLite 數據庫的 Room 庫,後來推出了 分頁(Paging)、 導航(Navigation) 和管理後臺任務的 WorkManager 庫。android
根據 2019 年最新的開發者調查中,70% 以上的專業開發者用過這五個庫當中的至少一個庫進行應用開發,接下來咱們將用上、下兩篇文章爲你們介紹 Android 架構組件的最新更新:數據庫
數據綁定 (Data Binding) 庫是一種支持庫,藉助該庫,您可使用聲明性格式 (而非程序化地) 將佈局中的界面組件綁定到應用中的數據源。數據綁定能夠理解爲代碼和 XML 標記語言之間的橋樑。緩存
更快的編譯速度安全
對開發者來講,處理界面中的數據綁定須要的時間成本不容忽視,咱們如今將數據綁定註解處理的速度提升了 20%*。bash
若是您的工做涉及到協同開發,還有一個好消息,那就是咱們增長了對分佈式構建緩存的支持。網絡
最後,數據綁定支持增量註解處理,能提高增量構建的性能。但這個功能還停留在測試階段,因此請在 Gradle 配置文件中使用以下代碼手動打開:架構
android.databinding.incremental = true
複製代碼
和 Android Studio 更緊密地集成app
實時生成類代碼
如今,給視圖中的某個控件賦予 ID, 它就會在綁定的類中成爲一個可用的字段。或者直接在 XML 中設置一個變量,並在視圖中訪問,代碼也能立刻給出對應的提示。這些都即時可用,無需編譯!
更好地支持重構在 IDE 裏使用重構的方式修改函數名稱以後,XML 中會同步進行更新。
更好用的報錯信息數據綁定出錯的信息可能一會兒跳出來 1,000 條,這種尷尬將成爲過去。如今在構建輸出信息窗口中,數據綁定錯誤單獨成組,這樣開發者能更輕鬆地找到本身須要處理的錯誤信息。
有沒有更好的視圖訪問方式? 視圖訪問方法固然不止一種,但正如上圖所示的,在簡明、編譯安全和編譯速度上,各個方法總有取捨。那有沒有一種方法能一石 "三" 鳥呢?即將到來!視圖綁定 (View Binding)
給出 ID 便可自動生成綁定類代碼且能保證編譯安全,能作到一石 "三" 鳥的視圖綁定可在 Android Studio 3.6 Canary 11 或更新版本中用得上。
<!-- profile.xml -->
<LinearLayout>
<TextView android:id="@id/title"/>
<ImageView android:id="@id/photo"/>
</LinearLayout>
class ProfileActivity:AppCompatActivity {
override fun onCreate(savedInstanceState:Bundle?) {
val binding = ProfileBinding.inflate(layoutInflater)
setContentView(binding.root)
// binding.title:TextView
// binding.photo:ImageView
}
}
複製代碼
△ 在生成的綁定類 inflate 以後,便可運行 setContentView,若是綁定的某個類型的控件不存在則沒法編譯。是時候告別 findViewById 了
全部的這些綁定類均由 Gradle 插件生成,若是開發者修改了某個佈局文件,會報錯的也會只有這個文件,100% 編譯安全。
"ViewModel 和 SavedState 同樣嗎?ViewModel 會破壞 SavedState 嗎?" ——不少開發者會這麼問
基本上,開發者會經過 ViewModel 或着 SavedState 來保存本身的內容/狀態,當應用配置發生變化時再從 ViewModel 或者 SavedState 中取回保存的內容/狀態:
若是隻這樣粗略地理解的話,ViewModel 和 SavedState 實際上是一回事。然而並非這樣的。SavedState 會經由 System Server (一個獨立的進程) 保存內容 (序列化的數據),也就是說,它會無視進程的限制。
而 ViewModel 則一直運行於進程內,即使應用配置發生變化,只要進程還在,ViewModel 保存的內容就不會消失。但只要進程消失,ViewModel 裏的內容也會消失。
ViewModel 用於:
SavedState 用於:
各取所長,聯手打造流暢體驗
// SavedStateHandle
class UserViewModel(val handle: SavedStateHandle) : ViewModel() {
}
複製代碼
如今用戶的 ViewModel 會在構造函數中接收一個 SavedStateHandle,這樣開發者就能在 ViewModel 中立刻訪問 SavedState。
而這個 SavedStateHandle 內部的邏輯也很是直白: 一個 Map 類的鍵值結構。固然,也提供了 LiveData 供訪問,只不過在這裏使用的是 MutableLiveData (由於 SavedState 是可變的)。
// map-like object
val handle : SavedStateHandle
// read
val myValue : Int = handle.get("key")
// write
handle.put("key", newValue)
// or
val liveData : MutableLiveData<Int> = handle.getLiveData("key")
// observe as usual
liveData.observe (lifecycleOwner) { value -> }
// write
liveData.value = newValue
複製代碼
更 Kotlin 友好的代碼
咱們會持續確保 Kotlin 語言的首選開發語言地位。其中一個例子就是 liveData.observe 如今支持 lambda 表達式:
// lifecycle-livedata-ktx
liveData.observe(lifecycleOwner) { newValue ->
}
複製代碼
另外一個例子則是 LiveData 再也不須要使用靜態的 Transformations.map 方法:
// lifecycle-livedata-ktx
// 之前
val mapped = Transformations.map(liveData) {
user -> user.name
}
// 如今
val mapped = liveData.map { user -> user.name }
複製代碼
ViewModel 的初始化也大幅精簡,之前您可能須要這麼操做:
// ViewModels initialization
lateinit var userViewModel: UserViewModel
fun onCreate(bundle: Bundle?) {
userViewModel = ViewModelProviders.of(this)
.get(UserViewModel::class.java)
}
複製代碼
而如今只須要一行:
// ViewModels initialization
val userViewModel: UserViewModel by viewModels()
複製代碼
導航 (Navigation) 是一套管理應用內 UI 流程的 Jetpack 代碼庫,現已發佈了 2.1 的穩定版,與此同時下一個版本也已經出如今了不遠的前方,接下來咱們會:
請你們保持對本次連載的關注,咱們會在下篇中爲你們介紹分頁庫、Room 持久性庫和 WorkManager 的更新進展。您也能夠觀看 ☟下面的視頻☟ 重溫咱們對架構組件進展的介紹。
騰訊視頻連接: v.qq.com/x/page/g300…
Bilibili 視頻連接: www.bilibili.com/video/av711…
但願在瞭解完架構組件的最新進展後,你們能在其中找到適合本身應用的功能。若是對架構組件有疑問或者建議,歡迎在評論區和咱們分享。
點擊這裏進一步瞭解 Android Jetpack