初探

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

更多相关文章

  1. 【Android】利用Fiddler进行抓包详解教程。抓取接口以及数据,可以
  2. AIDL --- Android中的远程接口
  3. Android中Parcelable和Serializable接口用法
  4. android生命周期onstop不一定会执行
  5. Android接口测试-JUnit入门
  6. Android LCD(三):Samsung LCD接口篇
  7. Android Service生命周期及用法!

随机推荐

  1. 拥抱Android:编译nginx搭建移动平台
  2. Android学习总结--第一周
  3. Android——Messenger
  4. Android(安卓)常见的五大布局
  5. Android下的配置管理之道之高通拆仓
  6. android布局layout中的一些属性
  7. android布局layout中的一些属性
  8. Android实现推送方式解决方案
  9. Android(安卓)蓝牙自动连接实现
  10. Android(安卓)- Activity - 启动模式