Jetpack

背景

最近在准备面试,结合之前的工作经验和近期在网上收集的一些面试资料,准备将Android开发岗位的知识点做一个系统的梳理,整理成一个系列:Android应用开发岗 面试汇总。本系列将分为以下几个大模块:
Java基础篇、Java进阶篇、常见设计模式
Android基础篇、Android进阶篇、性能优化
网络相关、数据结构与算法
常用开源库、Kotlin、Jetpack

注1:以上文章将陆续更新,直到我找到满意的工作为止,有跳转链接的表示已发表的文章。
注2:该系列属于个人的总结和网上东拼西凑的结果,每个知识点的内容并不一定完整,有不正确的地方欢迎批评指正。
注3:部分摘抄较多的段落或有注明出处。如有侵权,请联系本人进行删除。

本节只对部分常见的组件库进行概述,较少使用或者不需要介绍的库在此忽略

1 Jetpack是什么

Jetpack 是一个丰富的组件库,它的组件库按类别分为 4 类,分别是架构(Architecture)、界面(UI)、行为(behavior)和基础(foundation)。每个组件都可以单独使用,也可以配合在一起使用。每个组件都给用户提供了一个标准,能够帮助开发者遵循最佳做法,减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者能够集中精力编写重要的业务代码。


image.png

1.1 优势

  • 解决了 Android 架构问题:官方出品,以往的第三方库质量参差不齐,无法判断是否为最佳方案
  • 提升了代码质量:Jetpack 拥有基于生命周期感知的能力,可以减少 NPE 崩溃、内存泄漏。为我们开发出健壮且流畅的程序提供强力保障;
  • 提升了开发效率
    Jetpack 可以减少样板代码,有助于提升 Android 开发的效率。这些组件可以单独使用,也可以组合使用,并且在不同 Android 版本中运行一致。

1.2 Jetpack 与 AndroidX 的关系

  • Jetpack 是各种组件库的统称,AndroidX 是这些组件的统一包名。
  • AndroidX 对原始 Android Support Library 进行了重大改进,后者现在已不再维护。androidx 软件包完全取代了 support 包,不仅提供同等的功能,而且提供了新的库。
  • 与 Support Library 一样,androidx 命名空间中的库与 Android 平台分开提供,并向后兼容各个 Android 版本。

链接

2 ViewModel

Android中的ViewModel是Android Jetpack组件库中的一个组件,在Android MVVM模式中被广泛使用。ViewModel的主要特性是以注重生命周期的方式存储和管理数据。这种特性体现在ViewModel与Android组件(Activity、Fragment和Service)的生命周期相绑定,在组件的生命周期中ViewModel的数据会一直保存在内存中,即便是在系统配置变更时也会存在(屏幕旋转、语言切换等)。

2.1生命周期:

image.png

2.2 实现原理

  • ①Activity 的父类 ComponentActivity 实现了 ViewModelStoreOwner 接口,通过 ViewModelProvider 使用默认工厂 创建了 viewModel ,并通过唯一Key值 进行标识,存储到了 ViewModelStore 中。等下次需要的时候即可通过唯一Key值进行获取。
  • ②由于ComponentActivity 实现了ViewModelStoreOwner 接口,实现了 getViewModelStore 方法,当屏幕旋转的时候,会先调用onRetainNonConfigurationInstance() 方法将 viewModelStore 保存起来,然后再调用getLastNonConfigurationInstance 方法将数据恢复,如果为空的话,会重新创建 viewModelStore ,并存储在全局中,以便以下次发生变化的时候,能够通过onRetainNonConfigurationInstance 保存起来。
  • ③最后当页面销毁并且没有配置更改的时候,会将viewModelStore 中的数据 进行清除操作。

一句话总结:Activity的回调方法中实现了ViewModel的自动存取。

链接

2.3 ViewModel妙用:Activity与Fragment"通信"、Fragment与Fragment"通信"

有了ViewModel,Activity与Fragment可以共享一个ViewModel,因为Fragment是依附在Activity上的,在实例化ViewModel时将该Activity传入ViewModelProviders,它会给你一个该Activity已创建好了的ViewModel,这个Fragment可以方便的访问该ViewModel中的数据.在Activity中修改userModel数据后,该Fragment就能拿到更新后的数据.

public class MyFragment extends Fragment {
     public void onStart() {
        //这里拿到的ViewModel实例,其实是和Activity中创建的是一个实例
         UserModel userModel = ViewModelProviders.of(getActivity()).get(UserModel.class);
     }
 }

链接

3 LiveData

LiveData具有保证UI和状态一致、避免内存泄漏、避免手动管理生命周期等优点。可以将线程从子线程切换到UI线程。通过观察者模式,实现数据的订阅/发布框架。

3.1 使用

LiveData是一个在线程间传递数据的容器。当后台线程得到数据后,通过postValue()方法投递数据。其他线程通过getValue()得到数据。为了通知其他线程,LiveData采用的观察者模式。通过observe()方法,主线程可以在数据更新后立即得到通知。

3.2 实现原理

  • LiveData传递数据的方法也是通过Handler。在postValue()方法中,LiveData调用ArchTaskExecutor.postToMainThread(),将一个Runnable对象传递给主线程。这个Runnable对象调用setValue()对数据进行更新。
  • 更新数据的时候,LiveData首先将版本号加1,然后遍历观察者。如果观察者处于活跃状态(Lifecycle.State是STARTED或RESUMED),并且观察者的版本号小于LiveData,LiveData会调用观察者的onChanged()方法进行通知。

链接

4 Room

Room是Jetpack提供的SQLite ORM工具。Room中存取数据的方法都是阻塞的,要在后台执行,因此非常适合与LiveData配合使用。Room中定义的Dao可以返回LiveData,当SQLite查询返回后,对界面进行更新。

5 Lifecyle

Lifecycle是Android Architecture Components的成员,是一个生命周期感知组件,能够感知Activity、Fragment等组件的生命周期变化,并将变化通知到已注册的观察者。正确的使用有助于更好地组织代码,减少内存泄漏,增强稳定。
链接

6 ViewBinding与DataBinding

6.1 ViewBinding 视图绑定

在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件自动生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。
使用:

private ResultProfileBinding binding; //该类为编译器自动生成
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ResultProfileBinding.inflate(getLayoutInflater());
        View view = binding.getRoot();
        setContentView(view);

       binding.button.setOnClickListener(xxx);
    }

6.2 与DataBinding(数据绑定)的对比

视图绑定和数据绑定均会生成可用于直接引用视图的绑定类。但是,视图绑定旨在处理更简单的用例,与数据绑定相比,具有以下优势:

  • 更快的编译速度:视图绑定不需要处理注释,因此编译时间更短。
  • 易于使用:视图绑定不需要特别标记的 XML 布局文件,因此在应用中采用速度更快。在模块中启用视图绑定后,它会自动应用于该模块的所有布局。

反过来,与数据绑定相比,视图绑定也具有以下限制:

  • 视图绑定不支持布局变量或布局表达式,因此不能用于直接在 XML 布局文件中声明动态界面内容。
  • 视图绑定不支持双向数据绑定。

考虑到这些因素,在某些情况下,最好在项目中同时使用视图绑定和数据绑定。您可以在需要高级功能的布局中使用数据绑定,而在不需要高级功能的布局中使用视图绑定。

你可能感兴趣的:(Jetpack)