前言

LifeCycle是Android官方提供的组件,可见地址:https://developer.android.com/topic/libraries/architecture/lifecycle

Lifecycle 是一个类,它持有关于组件(如 Activity 或 Fragment)生命周期状态的信息,并且允许其他对象观察此状态。

以下是阅读官网的说明:

LifeCycle指的是使用生命周期通知组件去处理生命周期。

支持生命周期的组件执行操作以响应另一个组件(例如活动和片段)的生命周期状态更改。这些组件可帮助您生成组织性更好,并且通常重量更轻的代码,这些代码更易于维护。

常见的模式是在activity和fragment的生命周期方法中实现依赖组件的操作。但是,这种模式导致代码的组织不良以及错误泛滥。通过使用生命周期感知组件,您可以将相关组件的代码从生命周期方法中移出并移入组件本身。

该android.arch.lifecycle 软件包提供了类和接口,使您可以构建支持生命周期的 组件,这些组件可以根据activity或fragment的当前生命周期状态自动调整其行为。

注意:要导入 android.arch.lifecycle 到您的Android项目中

为什么要用LifeCycle

我们在处理activity或者fragment的生命周期时,不可避免会遇到这样的情况:在activity的oncreate中初始化某些成员变量,在onstop中释放或者销毁。实际开发中会导致oncreate onstop中的代码非常臃肿。

LifeCycle使用说明

举例使用mvp模式说明:

1、新建工程

在project的build.gradle中添加

maven {

            url 'https://maven.google.com'

        }

官网上写的是google(),但是google()需要gradle 4.0才支持

2、要观察到Presenter的生命周期事件都列了出来,封装到BasePresenter 中,只要继承了BasePresenter 的子类都能感知到Activity容器对应的生命周期事件,并在子类重写对应的行为代码

public interface IPresenter extends LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)

    void onCreate(@NotNull LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)

    void onDestory(@NotNull LifecycleOwner owner);

    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)

    void onLifeCycleChanged(@NotNull LifecycleOwner owner, @NotNull Lifecycle.Event event);

}



public class BasePresenter implements IPresenter {


    @Override

    public void onCreate(@NotNull LifecycleOwner owner) {

    }

    @Override

    public void onDestory(@NotNull LifecycleOwner owner) {

    }

    @Override

    public void onLifeCycleChanged(@NotNull LifecycleOwner owner, @NotNull Lifecycle.Event event) {

    }

}


public class MainPresenter extends BasePresenter {

    private final String TAG = MainPresenter.class.getName();

    private Context context;

    public MainPresenter(Context context) {

        this.context = context;

    }

    @Override

    public void onCreate(@NotNull LifecycleOwner owner) {

        super.onCreate(owner);

        Log.d(TAG, "LifeCycle------onCreate------");

    }

    @Override

    public void onDestory(@NotNull LifecycleOwner owner) {

        super.onDestory(owner);

        Log.d(TAG, "LifeCycle------onDestory------");

    }

}

3、在Activity/Fragment容器中添加Observer:


public class MainActivity extends AppCompatActivity {

    private IPresenter mPresenter;

    private final String TAG = MainActivity.class.getName();

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Log.d(TAG, "MainActivity------onCreate------");

        mPresenter = new MainPresenter(this);

        getLifecycle().addObserver(mPresenter);//添加LifecycleObserver

    }

    @Override

    protected void onDestroy() {

        super.onDestroy();

        Log.d(TAG, "MainActivity------onDestroy------");

    }

}

这样的话,每当Activity发生了对应的生命周期改变,Presenter就会执行对应事件注解的方法

除onCreate和onDestroy事件之外,Lifecycle一共提供了所有的生命周期事件,只要 

通过注解进行声明,就能够使LifecycleObserver观察到对应的生命周期事件:




原理说明

网上的图


LifecycleObserver接口( Lifecycle观察者):实现该接口的类,通过注解的方式,可以通过被LifecycleOwner类的addObserver(LifecycleObserver o)方法注册,被注册后,LifecycleObserver便可以观察到LifecycleOwner的生命周期事件

LifecycleOwner接口(Lifecycle持有者):实现该接口的类持有生命周期(Lifecycle对象),该接口的生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。

Lifecycle(生命周期):和LifecycleOwner不同的是,LifecycleOwner本身持有Lifecycle对象,LifecycleOwner通过其Lifecycle getLifecycle()的接口获取内部Lifecycle对象。

State(当前生命周期所处状态):如图所示。

Event(当前生命周期改变对应的事件):如图所示,当Lifecycle发生改变,如进入onCreate,会自动发出ON_CREATE事件。


以SupportActivity(AppCompatActivity extends SupportActivity)为例,SupportActivity实现了LifecycleOwner接口,这意味着SupportActivity对象持有生命周期对象(Lifecycle),并可以通过Lifecycle getLifecycle()方法获取内部的Lifecycle对象


可以看到,实现的getLifecycle()方法,实际上返回的是 LifecycleRegistry 对象,LifecycleRegistry对象实际上继承了 Lifecycle,这个下文再讲。

持有Lifecycle有什么作用呢?实际上在SupportActivity( ReportFragment.injectIfNeededIn())对应的生命周期内,都会发送对应的生命周期事件给内部的 LifecycleRegistry对象处理,内部的Lifecycle对象(就是mLifecycleRegistry)将生命周期对应的事件作为参数传给了 handleLifecycleEvent() 方法

handleLifecycleEvent方法会通过 getStateAfter 获取当前应处的状态并修改 Lifecycle本身的State 值,紧接着遍历所 LifecycleObserver 并同步且通知其状态发生变化,因此就能触发LifecycleObserver 对应的生命周期事件。


总结

Lifecycle简单且独立(实际上配合其他组件味道更佳)。

更多相关文章

  1. Android(安卓)listview onItemClick事件失效的原因
  2. [置顶] android 按钮两次点击事件区分
  3. 在Android中使用响应式编程
  4. Android各种事件处理一览(单击事件、触摸事件、物理按键事件、长
  5. Android点击事件分发机制源码分析1——Activity
  6. AdapterViewFlipper实现跑马灯横幅广告滚动效果
  7. Android(安卓)启动程序时动画效果(渐变)
  8. Android平台输入法的生命周期
  9. android 桌面小组件小记

随机推荐

  1. android百度地图 SDK v3.5.0
  2. Android 设置全屏显示的方法
  3. Phone Gap开发一:整合jQuery Mobile开发An
  4. 银联手机支付 手机客户端有几个?
  5. android 单击 切换图片 --- 注意图片大小
  6. 使用android 隐藏命令
  7. 深入解析RxJava源码(一)Observable对象的构
  8. 【Android自学笔记】为Android应用程序添
  9. Android RecyclerView网格布局的学习
  10. [置顶] Android 通过经纬度获取地理位置