IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android Jetpack学习(一)--Lifecycles -> 正文阅读

[移动开发]Android Jetpack学习(一)--Lifecycles

一、Jetpack是什么

Jetpack是Google为了解决Android架构问题而引入的一套库、工具和指南,可以帮助开发者更轻松地编写应用程序。Jetpack包含了架构组件、基础组件、行为组件和界面组件;这里主要介绍架构组件的学习,最后再介绍google官方推出的架构。

架构组件包含了:

  1. Lifecycles 生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。
  2. Navigation
    它管理应用中多个屏幕之间的复杂导航、过渡动画、深层链接以及编译时间检查参数传递。
  3. ViewModel ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel类让数据可在发生屏幕旋转等配置更改后继续留存。(例如屏幕旋转)。通常和DataBinding配合使用,为开发者实现MVVM架构提供了强有力的支持。
  4. LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
  5. Room Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。
  6. WorkManager 供开发者“轻松调度”那些即使在退出应用或重启设备后仍应运行的“可靠”异步任务
  7. DataBinding 使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源。
  8. Paging 分页加载

二、介绍

1.Lifecycles

1.1 诞生的背景:

以往我们使用的类通常依赖于系统组件(如 Activity 和 Fragment )的生命周期状态的变化.例如:我们
在页面的onCreate()方法中对自己的组件进行初始化,在onPause()方法中停止组件,而在页面的onDestroy()方法中对组件进行资源回收工作。但是这样的工作非常烦琐,会让页面与组件之间的耦合度变高。但这些工作又不得不做,因为这可能会引发内存泄漏。
Lifecycle就是为了解决这种生命周期感知模式下,耦合度变高,代码不易扩展,难以维护的问题。

1.2 如何使用

1. 迁移到AndroidX

androidx.lifecycle 软件包提供了可用于构建生命周期感知型组件的类和接口 - 这些组件可以根据 Activity 或 Fragment 的当前生命周期状态自动调整其行为。

如果你想使用jetpack相关的组件,请将项目迁移至Androidx中(如果你已经在使用androidx库了,请忽略)

Android Studio 3.2 及更高版本,您只需从菜单栏中依次选择 Refactor > Migrate to AndroidX,即可将现有项目迁移到 AndroidX。

点击Migrate.
Android 插件会通过重写现有第三方库的二进制文件,自动将这些库迁移为使用 AndroidX。

重构命令使用两个标记。默认情况下,这两个标记在 gradle.properties 文件中都设为 true:

android.useAndroidX=true

Android 插件会使用对应的 AndroidX 库而非支持库。

android.enableJetifier=true

此外您的编译 SDK 设置为 Android 9.0(API 级别 28)或更高版本

2、配置依赖

有的博客添加的依赖是:

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

注意

lifecycle-extensions 中的 API 已弃用。您可以为特定 Lifecycle 工件添加所需的依赖项

JAVA:

    dependencies {
        def lifecycle_version = "2.4.0-alpha02"
        def arch_version = "2.1.0"

        // ViewModel
        implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"
        // LiveData
        implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"
        // Lifecycles only (without ViewModel or LiveData)
        implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"

        // Saved state module for ViewModel
        implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"

        // Annotation processor
        annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
        // alternately - if using Java8, use the following instead of lifecycle-compiler
        implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"

        // optional - helpers for implementing LifecycleOwner in a Service
        implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version"

        // optional - ProcessLifecycleOwner provides a lifecycle for the whole application process
        implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"

        // optional - ReactiveStreams support for LiveData
        implementation "androidx.lifecycle:lifecycle-reactivestreams:$lifecycle_version"

        // optional - Test helpers for LiveData
        testImplementation "androidx.arch.core:core-testing:$arch_version"
    }
    

当前lifecycle_version信息和Kotlin的依赖请参考:
lifecycle版本号

3、案例

假设我们需要做一个视频播放功能:在打开页面的时候进行视频的播放,关闭页面停止播放。我们首先定义一个PlayerManager,我们通常这样做

在不使用Lifecycle组件的情况下
public class PlayerManager   {

    /**
     * 创建播放器
     */
    public void createrPlay(){
        LoggeHelper.E("createrPlay");
    }

    /**
     * 开始播放
     */
    public void startPlay(){
        LoggeHelper.E("startPlay");
    }

    /**
     * 停止播放
     */
    public void stopPlay(){
        LoggeHelper.E("stopPlay");
    }

    /**
     * 销毁播放器
     */
    public void destoryPlay(){
        LoggeHelper.E("destoryPlay");
    }

}

然后我们在Activity或者Fragment的生命周期中使用这些方法。

使用Lifecycle组件
public class PlayerManager  implements LifecycleObserver {

    /**
     * 创建播放器
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void createrPlay(){
        LoggeHelper.E("createrPlay");
    }

    /**
     * 开始播放
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void startPlay(){
        LoggeHelper.E("startPlay");
    }

    /**
     * 停止播放
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stopPlay(){
        LoggeHelper.E("stopPlay");
    }

    /**
     * 销毁播放器
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void destoryPlay(){
        LoggeHelper.E("destoryPlay");
    }

}

在Activity中我们这样调用

public class Jetpack_LifecycleActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jetpack__lifecycle);
        getLifecycle().addObserver(new PlayerManager());
    }
}

是不是很简单,业务控件PlayerManager只管处理自己的逻辑,不需要再Activity的生命周期中多余的事情。
它是怎么做的呢?在上述代码中:

  • 首先我们让PlayerManager实现LifecycleObserver接口。在需要依赖于生命周期调用方法上使用@OnLifecycleEvent(Lifecycle.Event.ON_XXX)标签进行标识。这样,当页面生命周期发生变化时,这些被标识过的方法便会被自动调用。
  • 在Activity中通过getLifecycle().addObserver()方法,将观察者与被观察者绑定起来即可。

Jetpack为我们提供了两个类:LifecycleOwner(被观察者)和LifecycleObserver(观察者)。即通过观察者模式,实现对页面生命周期的监听。在新版本的SDK包中,Activity(framgent)已经默认实现了LifecycleOwner接口。LifecycleOwner接口中只有一个getLifecycle(LifecycleObserverobserver)方法,LifecycleOwner正是通过该方法实现观察者模式的。

我们看一下Lifecycle的源码

public abstract class Lifecycle {

    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
    @NonNull
    AtomicReference<Object> mInternalScopeRef = new AtomicReference<>();

    @MainThread
    public abstract void addObserver(@NonNull LifecycleObserver observer);

    @MainThread
    public abstract void removeObserver(@NonNull LifecycleObserver observer);

    @MainThread
    @NonNull
    public abstract State getCurrentState();

    @SuppressWarnings("WeakerAccess")
    public enum Event {

        ON_CREATE,

        ON_START,

        ON_RESUME,

        ON_PAUSE,

        ON_STOP,

        ON_DESTROY,

        ON_ANY
    }

    @SuppressWarnings("WeakerAccess")
    public enum State {

        DESTROYED,

        INITIALIZED,

        CREATED,

        STARTED,

        RESUMED;

        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }
}

除了addObserver(),removeObserver();Lifecycle使用两个枚举来跟踪其关联组件的生命周期状态,这两个枚举分别是Event和State。

  • State:Lifecycle的生命周期所处的状态。
  • Event:Lifecycle生命周期对应的事件,这些事件会映射到Activity和Fragment中的回调事件中。

Event中的ON_ANY指代的是匹配所有的事件;
关于State和Event的所对应的关系。官方的图示说明的很清楚:

如果 Lifecycle 现在未处于良好的状态,则应避免调用某些回调。Lifecycle 类允许其他对象查询当前状态。示例:

lifecycle.getCurrentState().isAtLeast(STARTED)
自定义LifecycleOwner

使用 LifecycleRegistry 类,但需要将事件转发到该类

public class MyActivity extends Activity implements LifecycleOwner {
    private LifecycleRegistry lifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        lifecycleRegistry = new LifecycleRegistry(this);
        lifecycleRegistry.markState(Lifecycle.State.CREATED);
    }

    @Override
    public void onStart() {
        super.onStart();
        lifecycleRegistry.markState(Lifecycle.State.STARTED);
    }

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return lifecycleRegistry;
    }
}

1.4 LifecycleService

为了便于对Service生命周期的监听,达到解耦Service与组件的目的,Android提供了一个名为LifecycleService的类。该类继承自Service,并实现了LifecycleOwner接口。与Activity/Fragment类似,它也提供了一个名为getLifecycle()的方法供我们使用。使用方法和前面类似,就不介绍了。

1.5 ProcessLifecycIeOwner

ProcessLifecycIeOwner用于管理整个应用进程的生命周期。
ProcessLifecycleOwner的使用方式与Activity、Fragment和Service是类似的,其本质也是观察者模式。由于我们要观察的是整个应用程序,因此,需要在Application中进行相关代码的编写。
使用方法与前面的类似,我们只列举Applicaion中的代码

public class MyApplication  extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(new MyApplicationObserver());
    }
}

注意:在Application中,Lifecycle.Event.ON_CREATE只会被调用一次,而Lifecycle.Event.ON_DESTROY永远不会被调用。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:36:36  更:2021-07-24 11:38:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 2:55:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码