JetPack最新库的简单介绍

2021-07-19 16:12:06 浏览数 (1)

本文简单了解JetPack最新的改动。官方链接

1.androidx.activity

这个其实没啥可说的,其实就是简化了一部分用法,比如把构造器放到activity上去。参考链接

How AndroidX changes the way we work with Activities and Fragments

A first look at AndroidX Activity Result APIs

2.androidx.appcompat

也没啥可说的,相当于对Android Support Library的一次升级.具体介绍在这里

总是听到有人说AndroidX,到底什么是AndroidX?

3.androidx.camera

主要还是使用Camera需要一大堆繁琐的回调。androidx.camera就是对Camera和Camera2的简化.

现在预览只需要如下代码(少了一大堆回调是不是简单多了)

代码语言:javascript复制
    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)
            }
    }

拍照的代码如下

代码语言:javascript复制
    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。等以后观察吧

4.androidx.compose

demo在这里 https://blog.csdn.net/u012556114/article/details/103285377

compose感觉和flutter有点相似。Compose源码里的注释直接给出说他们参考了很多Flutter的东西。估计最终结局会和rn,flutter一样不冷不热。很大原因是因为android原生已经发展到今天了,尽管版本适配很头疼,但是真要换估计很多人都不乐意。自己学学就好

5.androidx.databinding

这里有一片讲解的文章 androidx.databinding 基本使用、单向绑定、双向绑定、MVVM

6.androidx.fragment

同 androidx.activity,简化了一部分用法

7.androidx.hilt

官方地址

Hilt 是 Android 的依赖项注入库,可减少在项目中执行手动依赖项注入的样板代码。依赖注入这个东西门槛还是挺高的,本人也曾经尝试写过相关blog,但是总感觉不是那么容易理解,要想写出来更困难,所以放弃了。有兴趣的可以去研究

8.androidx.lifecycle

写过。只不过当时引入的不是androidx而是android

Jetpack:Lifecycle

Jetpack:ViewModel

Jetpack:LiveData

9.Material Design

JetPack Material Design 组件简单介绍

这是本人写的,里面有一两个还是可以用到现有项目中的,不过大多没啥用,主要是有更成熟的方案

10.androidx.navigation

使用这个库有一个前提条件,就是整个app只有一个activity多个fragment。2017年,JakeWharton 曾经建议 App 只用一个 Activity,你可以使用 Fragments,只是别用 Fragments 回退栈。(这个建议有争议性)

首先回答一下为什么他不建议用多个activity。因为 Activity 是一个程序入口。你可以将其视为 app 的一个 main 函数。站在用户的立场上,通常你进入 app 的方式可能包括以下几种:

  • launcher 桌面程序(main 函数入口);
  • 来自参数化 main 函数入口的通知栏,并且导航到 app 的指定位置;
  • 如果你做的是一个相机应用,那么需要处理图片请求的 intents;
  • 如果你做的是一个社交产品,那么需要处理 share 请求的 intents;

差不多类似这些场景。但是,如果你真的不用分享和来自应用的 intents 的话,并且唯一的程序入口就是 launcher 桌面,别为每一个页面创建一个新的入口。这样做其实没有意义。为什么没有意义?因为这种场景下,进程死掉后 launcher 能够启动任何你应用中的 Activity 页面

这一点本人感觉无所谓的。更何况大家都熟悉了多activity的方式

第二点就是不用Fragments 回退栈。这个很好理解,回退栈不好管理,而且生命周期会很莫名其妙。

navigation库就是在单activity多fragment的情况下不用回退栈的方案

11.androidx.paging

我自己写了一篇 android paging 库介绍。

我写的时候因为编译器的原因没有用高版本,据说高版本支持RxJava(RxPagedListBuilder)。有兴趣可以去看看,尝试一下

12.androidx.room

Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。简单来说,加了一层封装,使用起来更方便

Android数据库的使用:room

13.androidx.workmanager

处理后台任务的,参考 使用 WorkManager 处理后台作业 - Kotlin

14.androidx.datastore

DataStore 有两种实现方式:Preferences 和 Proto,从中选择其一即可

。使用上跟SharedPreference很类似,也很简单,Android官方推荐使用

15.androidx.viewpager2

我自己写了一篇

深入了解ViewPager2

0 人点赞