JetPack最新庫的簡(jiǎn)單介紹

本文簡(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容