本文簡(jiǎn)單了解JetPack最新的改動(dòng)。官方鏈接
1.androidx.activity
這個(gè)其實(shí)沒啥可說的,其實(shí)就是簡(jiǎn)化了一部分用法,比如把構(gòu)造器放到activity上去。參考鏈接
How AndroidX changes the way we work with Activities and Fragments
A first look at AndroidX Activity Result APIs
2.androidx.appcompat
也沒啥可說的,相當(dāng)于對(duì)Android Support Library的一次升級(jí).具體介紹在這里
總是聽到有人說AndroidX,到底什么是AndroidX?
3.androidx.camera
主要還是使用Camera需要一大堆繁瑣的回調(diào)。androidx.camera就是對(duì)Camera和Camera2的簡(jiǎn)化.官方鏈接
現(xiàn)在預(yù)覽只需要如下代碼(少了一大堆回調(diào)是不是簡(jiǎn)單多了)
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(Runnable {
// Used to bind the lifecycle of cameras to the lifecycle owner
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// Preview
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(mViewFinder.surfaceProvider)
}
imageCapture = ImageCapture.Builder().build()
// Select back camera as a default
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
// Unbind use cases before rebinding
cameraProvider.unbindAll()
// Bind use cases to camera
cameraProvider.bindToLifecycle(
this, cameraSelector, preview, imageCapture)
} catch(exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
}
拍照的代碼如下
private fun takePhoto() {
// Get a stable reference of the modifiable image capture use case
val imageCapture = imageCapture ?: return
// Create time-stamped output file to hold the image
val photoFile = File(
outputDirectory,
SimpleDateFormat(FILENAME_FORMAT, Locale.US
).format(System.currentTimeMillis()) + ".jpg")
// Create output options object which contains file + metadata
val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()
// Set up image capture listener, which is triggered after photo has
// been taken
imageCapture.takePicture(
outputOptions, ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageSavedCallback {
override fun onError(exc: ImageCaptureException) {
Log.e(TAG, "Photo capture failed: ${exc.message}", exc)
}
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
val savedUri = Uri.fromFile(photoFile)
val msg = "Photo capture succeeded: $savedUri"
Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
Log.d(TAG, msg)
}
})
}
CameraX 是 Jetpack 的新增庫。利用該庫,可以更輕松地向應(yīng)用添加相機(jī)功能。該庫提供了很多兼容性修復(fù)程序和解決方法,有助于在眾多設(shè)備上打造一致的開發(fā)者體驗(yàn)。
官方是這么說的,但其實(shí)只是對(duì)Camera和Camera2的封裝。Camera2的兼容性存在一定問題.鏈接在這里 https://github.com/android-in-china/Compatibility/issues/3
而且最新的也只是 1.1.0-alpha02 ,還沒有正式 release。等以后觀察吧
4.androidx.compose
demo在這里 https://blog.csdn.net/u012556114/article/details/103285377
compose感覺和flutter有點(diǎn)相似。Compose源碼里的注釋直接給出說他們參考了很多Flutter的東西。估計(jì)最終結(jié)局會(huì)和rn,flutter一樣不冷不熱。很大原因是因?yàn)閍ndroid原生已經(jīng)發(fā)展到今天了,盡管版本適配很頭疼,但是真要換估計(jì)很多人都不樂意。自己學(xué)學(xué)就好
5.androidx.databinding
這里有一片講解的文章 androidx.databinding 基本使用、單向綁定、雙向綁定、MVVM
6.androidx.fragment
同 androidx.activity,簡(jiǎn)化了一部分用法
7.androidx.hilt
官方地址
Hilt 是 Android 的依賴項(xiàng)注入庫,可減少在項(xiàng)目中執(zhí)行手動(dòng)依賴項(xiàng)注入的樣板代碼。依賴注入這個(gè)東西門檻還是挺高的,本人也曾經(jīng)嘗試寫過相關(guān)blog,但是總感覺不是那么容易理解,要想寫出來更困難,所以放棄了。有興趣的可以去研究
8.androidx.lifecycle
寫過。只不過當(dāng)時(shí)引入的不是androidx而是android
Jetpack:Lifecycle
Jetpack:ViewModel
Jetpack:LiveData
9.Material Design
JetPack Material Design 組件簡(jiǎn)單介紹
這是本人寫的,里面有一兩個(gè)還是可以用到現(xiàn)有項(xiàng)目中的,不過大多沒啥用,主要是有更成熟的方案
10.androidx.navigation
使用這個(gè)庫有一個(gè)前提條件,就是整個(gè)app只有一個(gè)activity多個(gè)fragment。2017年,JakeWharton 曾經(jīng)建議 App 只用一個(gè) Activity,你可以使用 Fragments,只是別用 Fragments 回退棧。(這個(gè)建議有爭(zhēng)議性)
首先回答一下為什么他不建議用多個(gè)activity。因?yàn)?Activity 是一個(gè)程序入口。你可以將其視為 app 的一個(gè) main 函數(shù)。站在用戶的立場(chǎng)上,通常你進(jìn)入 app 的方式可能包括以下幾種:
- launcher 桌面程序(main 函數(shù)入口);
- 來自參數(shù)化 main 函數(shù)入口的通知欄,并且導(dǎo)航到 app 的指定位置;
- 如果你做的是一個(gè)相機(jī)應(yīng)用,那么需要處理圖片請(qǐng)求的 intents;
- 如果你做的是一個(gè)社交產(chǎn)品,那么需要處理 share 請(qǐng)求的 intents;
差不多類似這些場(chǎng)景。但是,如果你真的不用分享和來自應(yīng)用的 intents 的話,并且唯一的程序入口就是 launcher 桌面,別為每一個(gè)頁面創(chuàng)建一個(gè)新的入口。這樣做其實(shí)沒有意義。為什么沒有意義?因?yàn)檫@種場(chǎng)景下,進(jìn)程死掉后 launcher 能夠啟動(dòng)任何你應(yīng)用中的 Activity 頁面。
這一點(diǎn)本人感覺無所謂的。更何況大家都熟悉了多activity的方式
第二點(diǎn)就是不用Fragments 回退棧。這個(gè)很好理解,回退棧不好管理,而且生命周期會(huì)很莫名其妙。
navigation庫就是在單activity多fragment的情況下不用回退棧的方案,具體demo在
https://developer.android.com/codelabs/android-navigation#0
11.androidx.paging
我自己寫了一篇 android paging 庫介紹。
我寫的時(shí)候因?yàn)榫幾g器的原因沒有用高版本,據(jù)說高版本支持RxJava(RxPagedListBuilder)。有興趣可以去看看,嘗試一下
12.androidx.room
Room 持久性庫在 SQLite 的基礎(chǔ)上提供了一個(gè)抽象層,讓用戶能夠在充分利用 SQLite 的強(qiáng)大功能的同時(shí),獲享更強(qiáng)健的數(shù)據(jù)庫訪問機(jī)制。簡(jiǎn)單來說,加了一層封裝,使用起來更方便
Android數(shù)據(jù)庫的使用:room
13.androidx.workmanager
處理后臺(tái)任務(wù)的,參考 使用 WorkManager 處理后臺(tái)作業(yè) - Kotlin
14.androidx.datastore
DataStore 有兩種實(shí)現(xiàn)方式:Preferences 和 Proto,從中選擇其一即可
。使用上跟SharedPreference很類似,也很簡(jiǎn)單,Android官方推薦使用
15.androidx.viewpager2
我自己寫了一篇
深入了解ViewPager2