Android 生命周期组件 Lifecycle 使用详解

栏目: Android · 发布时间: 5年前

内容简介:2018 年的 Google I/O 大会上,Google 发布了 Android Jetpack,并称其为下一代的 Android 组件,旨在帮助开发者加快应用开发速度。准确来讲,Jetpack 是一系列 Android 软件组件的集合,它包括基础组件、架构组件、行为组件、界面组件。其中的 Android Architecture Components 指的就是这里的 “架构组件”。Android Architecture Components 是 Google 推荐的一个构建 APP 的应用架构,它包含

前言

2018 年的 Google I/O 大会上,Google 发布了 Android Jetpack,并称其为下一代的 Android 组件,旨在帮助开发者加快应用开发速度。准确来讲,Jetpack 是一系列 Android 软件组件的集合,它包括基础组件、架构组件、行为组件、界面组件。其中的 Android Architecture Components 指的就是这里的 “架构组件”。

Android Architecture Components 是 Google 推荐的一个构建 APP 的应用架构,它包含了一些列架构相关组件。而本篇文章我们要介绍的 Lifecycle 就是其中的一个与生命周期相关的库,同时,Lifecycle 也跟 LiveData 和 ViewModel 两个库紧密联系,想要搞懂后两者,就必须先搞懂它。

具体各组件之间的关系,以及各自在 Jetpack 中的地位,可以参见下面两幅来源于官网的图片。

Android 生命周期组件 Lifecycle 使用详解

Android 生命周期组件 Lifecycle 使用详解

Lifecycle 的作用

Lifecycle 是具有生命周期感知能力的组件,也就是说,我们能在 Activity 或者 Fragment 的生命周期发生变化的时候得到通知。我们往往会在 Activity 的各种生命中周期方法里执行特定的方法,比如,进行广播的注册和解绑、Eventbus 的注册和解绑等:

public class TestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
    }

    @Override
    protected void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }
}

如果我们把很多这种需要跟生命周期相关的逻辑代码都直接放在 Activity 的生命周期方法中,Activity 将会变得难以维护。通过 Lifecycle,我们就能通过把这些逻辑抽离出来,进而避免这种问题。因为本质上我们需要的只是 Activity 或者 Fragment 的生命周期发生改变的时候能通知到我们,以便我们在对应生命周期中执行对应的方法。

Lifecycle 的基本使用

2.0、 导入 Lifecycle 依赖

Lifecycle 被包含在 support library 26.1.0 及之后的依赖包中,如果我们的项目依赖的支持库版本在 26.1.0及以上,那么不需要额外导入 Lifecycle 库,本篇例子中使用的支持库是 28.0.0 :

implementation 'com.android.support:appcompat-v7:28.0.0'

如果支持库版本小于 26.1.0 ,就需要单独导入 Lifecycle 库 :

implementation "android.arch.lifecycle:runtime:1.1.1"

当然,如果项目已经迁移到了 AndroidX,可以使用下面的方式引入 :

implementation "androidx.lifecycle:lifecycle-runtime:2.0.0"

还是建议大家尝试尽快把项目迁移为 AndroidX,因为很多更新,会最先在 AndroidX 中发布,逐渐摆脱传统的support包。比如这里要讲的 Lifecycle 在 AndroidX 中已经升级到了 2.x 版本,而支持库中还是 1.x 版本。

鉴于支持库一般都在 26.1.0 以上,并且尚有大部分用户未迁移到AndroidX,在本篇文章中,我们使用 support library 28.0.0 中默认包含的 Lifecycle 库。我们在项目的 app 目录下的 build.gradle 文件中添加以下依赖:

implementation 'com.android.support:appcompat-v7:28.0.0'

以 support library 版本在 26.1.0 及以上为前提,这里我们分两种情况来讲。一种是我们创建的Activity 继承自 AppCompatActivity(以Activity 为例,Fragment类似),另一种是创建的 Activity 继承自普通的 Activity,而非 AppCompatActivity。

这里要先说一点, Lifecycle 的实现机制是观察者模式,意识到这点,再讲它的使用过程及原理就比较容易理解了。

整体流程:

getLifecycle()

2.1、 方式一:继承自 AppCompatActivity

首先,我们创建一个 MyObserver.java 类,让它实现 LifecycleObserver 接口( LifecycleObserver 接口是一个空接口,主要是给注解处理器使用),如下:

public class MyObserver implements LifecycleObserver {

    private static final String TAG = "MyObserver";

    // 使用注解  @OnLifecycleEvent 来表明该方法需要监听指定的生命周期事件
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void connectListener() {
//        ...
        Log.d(TAG, "connectListener:  --------   onResume" );
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void disconnectListener() {
//        ...
        Log.d(TAG, "disconnectListener: -------   onPause");
    }
}

可以看到,我们通过在方法上使用 @OnLifecycleEvent 注解使得该方法具有了生命周期感知能力。括号里面的参数,表明需要监听的是什么生命周期事件。Lifecycle 主要就是通过 EventState 这两个枚举类来跟踪所关联组件的生命周期状态。具体的 Event 和 State 之间的转换关系,可以参照下图:

Android 生命周期组件 Lifecycle 使用详解

接下来,让我们的 Activity 继承自 AppCompatActivity,然后在 onCreate(...) 方法中通过 getLifecycle().addObserver(new MyObserver()) 完成 Lifecycle 和LifecycleObserver 的绑定。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 就只需要这一行代码,简洁吧
        getLifecycle().addObserver(new MyObserver());
    }
}

然后我们就可以运行下程序,跑起来之后按 Home 键或者按返回键进行操作。能看到,随着生命周期的变化,MyObserver() 中定义的方法在控制台中也被正确地打印了出来。

Android 生命周期组件 Lifecycle 使用详解

是不是觉得特别简单。

但之所以毫不费力,是因为有人替你“负重前行”。在 support library 26.1.0 及以后的支持库中,AppCompatActivity 的祖先类 SupportActivity 已经默认实现了 LifecycleOwner 接口,通过其 getLifecycle() 方法可以直接返回一个 Lifecycle 对象。之后我们就可以通过该对象的 addObserver(...) 方法将 Lifecycle 跟指定的 LifecycleObserver 进行绑定。

2.2、 方式二:继承自普通的 Activity

首先,我们仍然需要像上面的方式,来创建一个 MyObserver 对象。

这次我们创建一个继承自普通的 Activity 的 Activity ,那自然无法直接使用 getLifecycle() 方法来获取 Lifecycle 。无法直接使用,那我们能否模仿 AppCompatActivity 的实现,来自己创建 Lifecycle 对象呢?当然可以。这时候,我们就需要自己实现 LifecycleOwner 接口,并在具体的生命周期下通过 LifecycleRegistrymarkState(...) 方法来主动进行事件的分发。请看下面改造过的 MainActivity.java 代码 :

public class MainActivity extends Activity implements LifecycleOwner {

    private LifecycleRegistry mLifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mLifecycleRegistry = new LifecycleRegistry(this);
        getLifecycle().addObserver(new MyObserver());
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mLifecycleRegistry.markState(Lifecycle.State.RESUMED);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mLifecycleRegistry.markState(Lifecycle.State.STARTED);
    }

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

然后运行代码,发现结果和上面的完全一样。

可以看到, MainActivity 实现了 LifecycleOwner 接口(实现该接口的对象,即是 Lifecycle 的持有者),并在其 getLifecycle( ) 方法中返回了一个 LifecycleRegistry 对象,而 LifecycleRegistry 是 Lifecycle 的实现类,能处理多个 Observer,我们自定义 LifecycleOwner的时候就可以直接使用它。其他使用方式,则完全相同。

为了让使用更加方便灵活,Lifecycle 还提供了查询当前组件所处的生命周期状态的方法:

lifecycle.getCurrentState().isAtLeast(STARTED)

总结

  1. 实现了 LifecycleObserver 接口的类可以和实现了 LifecycleOwner 接口的类无缝工作,因为 LifecycleOwner 可以提供一个 Lifecycle 对象,而 LifecycleObserver 就正需要对这个 Lifecycle 对象进行监听呢。
  2. LifecycleOwner 是从特定的类(比如 Activity 或者 Fragment 等)中抽象出来的Lifecycle 的持有者。
  3. LifecycleRegistry 是 Lifecycle 的实现类,用于注册和反注册那些需要监听当前组件生命周期的 LifecycleObserver

注意

从 1.0.0-rc1 版本的 Lifecycle 包开始,当 Activity 的 onSaveInstanceState() 方法调用结束之后,Lifecycle 将立刻被标记为 CREATEDON_STOP ,而不是等 onStop() 方法调用结束。这点和 API level 26 或者更低版本上 Activity 的生命周期的调用顺序并不匹配,需要稍加注意。有具体需求的可以进一步查阅相关文档。

更多最新消息,欢迎关注我的公众号获取:

Android 生命周期组件 Lifecycle 使用详解


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

R语言实战(第2版)

R语言实战(第2版)

[美] Robert I. Kabacoff / 王小宁、刘撷芯、黄俊文等 / 人民邮电出版社 / 2016-5 / 99.00元

本书注重实用性,是一本全面而细致的R指南,高度概括了该软件和它的强大功能,展示了使用的统计示例,且对于难以用传统方法处理的凌乱、不完整和非正态的数据给出了优雅的处理方法。作者不仅仅探讨统计分析,还阐述了大量探索和展示数据的图形功能。新版做了大量更新和修正,新增了近200页内容,介绍数据挖掘、预测性分析和高级编程。一起来看看 《R语言实战(第2版)》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换