JetPack扫盲篇

1,274 阅读3分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

JetPack扫盲篇

这几年所做的业务是偏底层一些,所以对一些流行的技术了解甚少,当然对JetPack了解的也不多,但随处可见的JetPack字眼代表着这玩意有多火热,这篇文章就搞懂它是什么,有什么用处。

一、JetPack 是什么

JetPack 是个工具包合集

看看官方怎么说 Jetpack 是一个由多个库组成的套件,可帮助开发者遵循最佳做法、减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者可将精力集中于真正重要的编码工作。

这个意思就是说官方造的轮子,稳定性和兼容性都要比外面的稳定,用它的轮子就不用操心具体实现了,把精力放在业务逻辑上。

二、为什么会有JetPack

笔者从14年开始做Android app,实习那时候,只要会写个Demo就能找到工作,哪像现在动不动就问底层问算法。随着Android的发展,Android开发者越来也多,Android就开始出现了各种流派,各式各样的技术选型,项目中开始站队MVC、MVP、MVVM,各式各样的轮子开始出现。

我印象很深有个Service向Activity进行传值,那时有相当一部分人选择用广播进行传递。

越来越杂的技术选型也让Android开发者无从选择,最终导致做出来的应用质量参差不齐。这些情况被谷歌发现后,最终在Goole I/O 2018大会上推出了全新的Android Jetpack。

JetPack 是 Android应用开发的工具集,是一套库、工具和指南的集合,旨在帮助开发者更轻松地编写优质应用。而实际上Jetpack所包含的内容是比较庞大的,主要由基础组件、架构组件、行为组件和UI组件构成。所以以后大家就用JetPack就能满足很大的需要了。

三、JetPack和AndroidX有什么关系

Jetpack是个统称,对外宣传的代号,AndroidX是Jetpack的包含的支持库的具体位置

四、JetPack包含哪些内容

官方图

Image.png

民间整理

JetPack分类有四种,分别是Architecture、Foundationy、Behavior、UI。

Image [1].png

五、JetPack CameraX 实践

按照以前的方式,写一个Camera有多复杂,我们要新建SurfaceView,将预览数据渲染到SurfaceView上才能显示,代码少说要几百行,更难的是兼容问题,弄不好就是镜像或者颠倒的。

来看看CameraX如何实现。

先看看效果

1.jpg

实现代码:

必须要JAVA 1.8及以上

//要求编译环境是JDK 8
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.camera.view.PreviewView
        android:id="@+id/camera_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:onClick="Switch"
        android:text="切换" />

</RelativeLayout>

Activity

public class MainActivity extends AppCompatActivity {

    private PreviewView cameraView;
    // 0 for rear facing and 1 for front facing
    int currentFacingSide;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PermissionChecker.PERMISSION_GRANTED) {
            startCamera();
        }
    }

    private void startCamera() {
        cameraView = findViewById(R.id.camera_view);
        final ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
        cameraProviderFuture.addListener(new Runnable() {
            @Override
            public void run() {
                try {
                    ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
                    bindPreview(cameraProvider);
                } catch (ExecutionException | InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, ContextCompat.getMainExecutor(this));
    }

    private void bindPreview(ProcessCameraProvider cameraProvider) {
        CameraSelector cameraSelector;
        Preview preview = new Preview.Builder().build();
        ImageCapture imageCapture = new ImageCapture.Builder().build();
        preview.setSurfaceProvider(cameraView.createSurfaceProvider());
        if (currentFacingSide == 0) {
            cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_FRONT).build();
            currentFacingSide = 1;
        } else {
            cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();
            currentFacingSide = 0;
        }
        cameraProvider.unbindAll();
        Camera camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture);
    }
    
    public void Switch(View view) {
        startCamera();
    }
}