Android Jetpack-Lifecycle

1.Lifecycle

Lifecycle是Jetpack中的一个生命周期感知型组件 ,可执行操作来感知响应其他组件(如Activity和Fragment)的生命周期状态的变化。

activity和fragment是有生命周期的,有时候很多操作需要写在生命周期方法中,比如下载文件操作等,这样会导致在生命周期方法中写越来越多的代码,activity/fragment越来越臃肿,代码维护困难。 使用Lifecycle就可以解决这类问题。

Lifecycle的出现就是为了解耦系统组件的生命周期与自定义组件之间的耦合,比如以前如果自定义组件需要在Activity对应的生命周期做处理时,就需要重写Activity的生命周期然后在生命周期方法里做相应的处理,而现在通过Lifecycle就可以省略掉重写生命周期方法这个步骤。

Lifecycle使用了观察者模式,通过Owner和Observer的配合实现了生命周期的解耦。Lifecycle通过实现LifecycleObserver接口来监听生命周期,然后在activity/fragment中注册监听。

注:Lifecycle需要在AndroidX的环境里才能使用。

 

几个重要的类和接口:

①Lifecycle:Lifecycle是一个持有组件生命周期状态信息的类,并允许其他对象观察此状态。

②Event:从框架和Lifecycle类派发的生命周期事件。这些事件会映射到Activity/Fragment的回调事件中。

③State:由Lifecycle对象跟踪的组件的当前状态。

④LifecycleOwner:生命周期持有者接口。实现该接口的类持有生命周期(Lifecycle对象),并且它的生命周期的改变会被其注册的观察者LifecycleObserver观察到并触发观察者对应的事件。LifecycleOwner接口有一个getLifecycle()方法,该方法必须由这个类来实现。任何自定义应用程序类都可以实现LifecycleOwner接口。

⑤LifecycleObserver:生命周期观察者接口。实现该接口的类就可以被LifecycleOwner类的addObserver(LifecycleObserver o)方法注册,只要在持有Lifecycle的类中注册了它,当LifecycleOwner的生命周期发生变化时,LifecycleObserver就能收到,从而进行自定义的操作。

实现LifecycleObserver的组件与实现LifecycleOwner的组件无缝协作,因为所有者可以提供生命周期,观察者可以注册以观看。

简单来说,LifecycleOwner就是一个接口,谁继承了它谁就持有了Lifecycle对象,然后就可以调用getLifecycle()方法获取继承了抽象类Lifecycle的LifecycleRegistry,然后调用addObserver方法来注册监听。这样,该接口的生命周期的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。

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

LifecycleObserver有两种实现方式:

1)实现DefultLifecyceObserver接口,然后重写里面生命周期方法;

2)直接实现LifecycleObserver接口,然后通过注解的方式来接收生命周期的变化;

官方文档建议使用第一种方式,因为文档中说明了,随着Java8成为主流,注解的方式会被弃用。

 

2.LifeCycle的用法

(1)Activity中使用

首先Activity需要继承自AppCompatActivity,因为它继承了FragmentActivity,而FragmentActivity继承自ComponentActivity,ComponentActivity实现了LifecycleOwner接口,LifecycleOwner接口就是实现生命周期解耦的关键。

然后需要在自定义组件中实现LifecycleObserver接口或DefultLifecycleObserver接口。

举例:以Activity跳转为例,有两个Activity,FirstActivity和SecondActivity,实现单纯的一个跳转。

先写一个需要拥有生命周期的类。正常自定义控件或做其他逻辑的类是没有生命周期的,现在有了LifecycleObserver,就可以让一个普通的类拥有感知生命周期变化的能力。比如现在自定义一个MyObserver类。

public class MyObserver implements DefaultLifecycleObserver{

    @Override

    public void onCreate(LifecycleOwner owner){

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

        Log.d(TAG,"当前生命周期状态= " + owner.getLifecycle.getCurrentState().name());

    }

    @Override

    public void onStart(LifecycleOwner owner) {

        Log.d(TAG,"onStart()");

        Log.d(TAG,"当前生命周期状态=" + owner.getLifecycle.getCurrentState().name());

    }

    @Override

    public void onResume(LifecycleOwner owner){

        Log.d(TAG,"onResume()");

        Log.d(TAG,"当前生命周期状态=" + owner.getLifecycle.getCurrentState().name());

    }

    @Override

    public void onPause(LifecycleOwner owner){

        Log.d(TAG,"onPause()");

        Log.d(TAG,"当前生命周期状态=" + owner.getLifecycle.getCurrentState().name());

    }

    @Override

    public void onStop(LifecycleOwner owner) {

        Log.d(TAG,"onStop()");

        Log.d(TAG,"当前生命周期状态=" + owner.getLifecycle.getCurrentState().name());

    }

    @Override

    public void onDestroy(LifecycleOwner owner) {

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

        Log.d(TAG,"当前生命周期状态=" + owner.getLifecycle.getCurrentState().name());

    }

}

采取直接继承DefaultLifecycleObserver接口的方式,并实现它所有方法。在每个方法里打了log来查看这个类是否能收到activity生命周期的变化。

接下来就是注册监听:

在Activity的OnCreate方法中调用getLifecycle()方法:

public class FirstActivity extends AppCompatActivity {

    private Button firstBtn;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView( R.layout.first_layout);

        initView();

        initListener();

        //注册监听

        getLifecycle().addObserver(new MyObserver());

    }

    private void initListener() {

        firstBtn.setOnClickListener(new View.OnClic

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值