这是我参与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包含哪些内容
官方图
民间整理
JetPack分类有四种,分别是Architecture、Foundationy、Behavior、UI。
五、JetPack CameraX 实践
按照以前的方式,写一个Camera有多复杂,我们要新建SurfaceView,将预览数据渲染到SurfaceView上才能显示,代码少说要几百行,更难的是兼容问题,弄不好就是镜像或者颠倒的。
来看看CameraX如何实现。
先看看效果
实现代码:
必须要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();
}
}