本文简单了解JetPack最新的改动。官方链接
这个其实没啥可说的,其实就是简化了一部分用法,比如把构造器放到activity上去。参考链接
How AndroidX changes the way we work with Activities and Fragments
A first look at AndroidX Activity Result APIs
也没啥可说的,相当于对Android Support Library的一次升级.具体介绍在这里
总是听到有人说AndroidX,到底什么是AndroidX?
主要还是使用Camera需要一大堆繁琐的回调。androidx.camera就是对Camera和Camera2的简化.
现在预览只需要如下代码(少了一大堆回调是不是简单多了)
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 的新增库。利用该库,可以更轻松地向应用添加相机功能。该库提供了很多兼容性修复程序和解决方法,有助于在众多设备上打造一致的开发者体验。
官方是这么说的,但其实只是对Camera和Camera2的封装。Camera2的兼容性存在一定问题.链接在这里 https://github.com/android-in-china/Compatibility/issues/3
而且最新的也只是 1.1.0-alpha02 ,还没有正式 release。等以后观察吧
demo在这里 https://blog.csdn.net/u012556114/article/details/103285377
compose感觉和flutter有点相似。Compose源码里的注释直接给出说他们参考了很多Flutter的东西。估计最终结局会和rn,flutter一样不冷不热。很大原因是因为android原生已经发展到今天了,尽管版本适配很头疼,但是真要换估计很多人都不乐意。自己学学就好
这里有一片讲解的文章 androidx.databinding 基本使用、单向绑定、双向绑定、MVVM
同 androidx.activity,简化了一部分用法
Hilt 是 Android 的依赖项注入库,可减少在项目中执行手动依赖项注入的样板代码。依赖注入这个东西门槛还是挺高的,本人也曾经尝试写过相关blog,但是总感觉不是那么容易理解,要想写出来更困难,所以放弃了。有兴趣的可以去研究
写过。只不过当时引入的不是androidx而是android
JetPack Material Design 组件简单介绍
这是本人写的,里面有一两个还是可以用到现有项目中的,不过大多没啥用,主要是有更成熟的方案
使用这个库有一个前提条件,就是整个app只有一个activity多个fragment。2017年,JakeWharton 曾经建议 App 只用一个 Activity,你可以使用 Fragments,只是别用 Fragments 回退栈。(这个建议有争议性)
首先回答一下为什么他不建议用多个activity。因为 Activity 是一个程序入口。你可以将其视为 app 的一个 main 函数。站在用户的立场上,通常你进入 app 的方式可能包括以下几种:
差不多类似这些场景。但是,如果你真的不用分享和来自应用的 intents 的话,并且唯一的程序入口就是 launcher 桌面,别为每一个页面创建一个新的入口。这样做其实没有意义。为什么没有意义?因为这种场景下,进程死掉后 launcher 能够启动任何你应用中的 Activity 页面。
这一点本人感觉无所谓的。更何况大家都熟悉了多activity的方式
第二点就是不用Fragments 回退栈。这个很好理解,回退栈不好管理,而且生命周期会很莫名其妙。
navigation库就是在单activity多fragment的情况下不用回退栈的方案
我自己写了一篇 android paging 库介绍。
我写的时候因为编译器的原因没有用高版本,据说高版本支持RxJava(RxPagedListBuilder)。有兴趣可以去看看,尝试一下
Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。简单来说,加了一层封装,使用起来更方便
处理后台任务的,参考 使用 WorkManager 处理后台作业 - Kotlin
DataStore 有两种实现方式:Preferences 和 Proto,从中选择其一即可
。使用上跟SharedPreference很类似,也很简单,Android官方推荐使用
我自己写了一篇