Android进阶 ——— Android官方架构组件Lifecycle

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dazhaoDai/article/details/81902704

初探

Lifecycle是Android官方推出的架构组件,在谷歌开发者官微发布的正式发布 Android 架构组件 1.0 稳定版 | 附带中文介绍视频
简明扼要的阐述了推出的架构组件的作用及使用,也可以查看Android开发者官网

先来看看架构组件的第一部分Lifecycle。
在长篇大论之前,先要了解它的作用,为什么谷歌要推出Lifecycle?

就是为了解决常见架构模式中,生命周期管理的痛点,例如MVP模式:
为了管理生命周期:

public interface IPresenter {

    void onCreate();

    void onStart();

    void onResume();

    void onPause();

    void onStop();

    void onDestroy();
}

继承Ipresenter接口

public class MainPresenter implements IPresenter {

    public void xxx(){

    }

    @Override
    public void onCreate() {

    }

    @Override
    public void onStart() {

    }

    @Override
    public void onResume() {

    }

    @Override
    public void onPause() {

    }

    @Override
    public void onStop() {

    }

    @Override
    public void onDestroy() {

    }
}

Activity或Fragment中:

/**
 * Created by dai
 * Created time 2018/8/20
 * function:lifecycle.example.com.lifecycleexample
 */

public class MainActivity extends AppCompatActivity {

    private MainPresenter presenter;

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

        presenter = new MainPresenter();
        presenter.onCreate();
    }


    @Override
    protected void onStart() {
        super.onStart();
        presenter.onStart();
    }

    @Override
    protected void onResume() {
        super.onResume();
        presenter.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        presenter.onPause();
    }

    @Override
    protected void onStop() {
        super.onStop();
        presenter.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        presenter.onDestroy();
    }
}

需要在Activity的每个声明周期中,依次调用接口IPresenter定义的方法,无疑影响开发效率,更麻烦的是,如果忘记调用声明周期的方法,例如APP被销毁,presenter中依然调用UI层,这必然产生严重后果。

使用

Lifecycle就是为了解决这种重复工作的。先来看看如何使用:
导入Java8依赖

    implementation "android.arch.lifecycle:common-java8:1.1.1"

继承DefaultLifecycleObserver

public interface IPresenter extends DefaultLifecycleObserver {

}

实现生命周期方法

public class MainPresenter implements IPresenter {

    private final String TAG = this.getClass().getSimpleName();
    public void xxx(){

    }


    @Override
    public void onCreate(LifecycleOwner owner) {
        Log.e(TAG,"oncreate");
    }

    @Override
    public void onStart(LifecycleOwner owner) {
        Log.e(TAG,"start");
    }

    @Override
    public void onResume(LifecycleOwner owner) {
        Log.e(TAG,"resume ");
    }

    @Override
    public void onPause(LifecycleOwner owner) {
        Log.e(TAG,"pause");
    }

    @Override
    public void onStop(LifecycleOwner owner) {
        Log.e(TAG,"stop");
    }

    @Override
    public void onDestroy(LifecycleOwner owner) {
        Log.e(TAG,"destory");
    }
}

在Activity中,只需要注册一下,就能完成生命周期的监听

public class MainActivity extends AppCompatActivity {

    private MainPresenter presenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        presenter = new MainPresenter();
        //注册
        getLifecycle().addObserver(presenter);
    }

}

IPrestener继承DefaultLifecycleObserver,MainPresenter实现IPresenter接口,并实现DefaultLifecycleObserver中定义的方法,可以全部实现,也可以选择需要的生命周期去实现。

了解了Lifecycle的使用,当然也要简单了解一下实现原理,知其然而不知其所以然,不是我们的目的。

原理

1.先了解几个重要的类和接口

  • Lifecycle
    Lifecycle是一个持有组件生命周期状态(如Activity或Fragment)的信息的类,并允许其他对象观察此状态。
  • Event :从框架和Lifecycle类派发的生命周期事件。这些事件映射到活动和片段中的回调事件。
  • State :由Lifecycle对象跟踪的组件的当前状态。
  • LifecycleOwner (重要)Lifecycle持有者 (例如Activity、Fragment)
    实现该接口的类持有生命周期(Lifecycle对象),该接口的生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。
  • LifecycleObserver(重要)Lifecycle观察者
    实现该接口的类,通过注解的方式,可以通过被LifecycleOwner类的addObserver(LifecycleObserver o)方法注册,被注册后,LifecycleObserver便可以观察到LifecycleOwner的生命周期事件。

2.LifecycleOwner(Lifecycle持有者)

官网介绍:LifecycleOwner是一个单一的方法接口,表示该类有一个 Lifecycle。它有一个方法,getLifecycle()这个方法 必须由这个类来实现。如果您试图管理整个应用程序进程的生命周期,请参阅 ProcessLifecycleOwner。该接口从各个类(如Fragment和AppCompatActivity)抽象生命周期的所有权,并允许编写与它们一起工作的组件。
任何自定义应用程序类都可以实现LifecycleOwner接口
实现LifecycleObserver的组件与实现LifecycleOwner的组件无缝协作,因为所有者可以提供生命周期,观察者可以注册以观看

简单理解:LifecycleOwner就是一个接口,谁继承了它,就持有了lifecycle对象,可以提供生命周期。
然后可以调用getLifecycle()方法获取继承了抽象类Lifecycle的LifecycleRegistry,然后调用addObserver(@NonNull LifecycleObserver observer) 方法来注册监听。
总而言之:
实现该接口的持有者,其生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件

注意:Support Library 26.1.0 及其以后的版本,Activity 和Fragment 已经实现了LifecycleOwner 接口,所以,我们可以直接在Activity 和Fragment中使用getLifecycle()方法来获取lifecycle对象,来添加观察者监听。

3.LifecycleObserver(Lifecycle观察者)

LifecycleObserver 是一个观察者接口,实现了它,可以通过注解或者继承的方式,来管理声明周期的监听。只要在持有lifecycle的类中注册了它,当声明周期发生变化时,它就能收到,进行我们自定义的操作。

简单理解:任何注解或继承实现了该接口,只要在持有Lifecycle的类中注册了,就可以监听到生命周期的变化

两种实现方式:
1)、实现DefultLifecyceObserver接口,然后重写里面生命周期方法;
2)、直接实现LifecycleObserver接口,然后通过注解的方式来接收生命周期的变化;
Lifecycle.java文档中是建议使用第一种方式,因为文档中说明了,随着Java8成为主流,注解的方式会被弃用。DefaultLifecycleObserver是需要另外声明的java8 ,所以上面我们添加了Java8的依赖.

再回顾上面的例子,是不是感觉思路逐渐明朗:

IPrestener继承DefaultLifecycleObserver,MainPresenter实现IPresenter接口,并实现DefaultLifecycleObserver中定义的方法,而Activity默认实现了LifecycleOwner接口,持有声明周期,最后在Activity中调用getLifecycle().addObserver(presenter)注册了LifecycleObserver

展开阅读全文

没有更多推荐了,返回首页