Android Jetpack 之 Lifecycle

记录学习


Lifecycle介绍
什么是Lifecycle?

LifeCycle是GoogleApp架构中推荐的一个组件。Lifecycles 包含有关Activity与Fragment生命周期状态的信息,并允许其他对象观察此状态。

Lifecycle组件包括LifecycleOwner、LifecycleObserver。

Lifecycle作用

简单的说就是用来监听Activity与Fragment的生命周期变化,在变化时能及时通知其他组件。
Lifecycle可以有效的避免内存泄漏和解决android生命周期的常见难题。
为什么要引进Lifecycle?

前面说了,Lifecycle能够让开发者构建能感知其他组件(主要指Activity 、Fragment)生命周期的类。在android开发的过程中,我们常常需要让一些操作能够感知Activity/Fragment的生命周期,从而实现在活动状态下允许操作,而在销毁状态下需要自动禁止操作,释放资源,防止内存泄露。

例如大名鼎鼎的图片加载框架 Glide 在 Acticiy/Fragment 处于前台的时候加载图片,而在不可见的状态下停止图片的加载,又例如我们希望 RxJava 的 Disposable 能够在Activity/Fragment 销毁是自动 dispose。Lifecycle 的出现,让开发者们能够轻易地实现上述的功能。

在我们的开发中,我们经常需要知道 activity 的生命周期,从而做一些资源释放或控制逻辑,Glide的做法,就是给activity添加一个 隐形的 fragment,从而感知 activity 的生命周期变化。

但Lifecycles 组件可以让任何一个类都能轻松感觉到 activity 的生命周期,但却不用编写太多逻辑。

场景
在使用mvp写页面时,p中需要感知Activity或Fragment的生命周期,以进行对应的处理。在这种情况下,Activity或Fragment会在各个生命周期的回调中调用p对应的方法,这是比较麻烦的。
自定义View需要对页面生命周期变化进行对应的处理,如动画的开始和结束,页面销毁时释放资源等。这种情况下,同样需要在Activity或Fragment的生命周期回调中调用View的各个方法。
在使用mvp时,p在收到某个通知时需要判断当前页面的生命周期状态,在这种情况下,需要维护一个记录当前生命状态的变量,也是比较麻烦的。

Lifecycle的使用方式

使用方式1:让要感知Activity生命周期的类实现DefaultLifecycleObserver接口
首先让MyPresenter实现DefaultLifecycleObserver接口,并重写7个生命周期方法

public class MyPresenter implements DefaultLifecycleObserver {
    @Override
    public void onCreate(@NonNull LifecycleOwner owner) {
        Log.d("MyPresenter","onCreate");
    }

    @Override
    public void onStart(@NonNull LifecycleOwner owner) {
        Log.d("MyPresenter","onStart");
    }

    @Override
    public void onResume(@NonNull LifecycleOwner owner) {
        Log.d("MyPresenter","onResume");
    }

    @Override
    public void onPause(@NonNull LifecycleOwner owner) {
        Log.d("MyPresenter","onPause");
    }

    @Override
    public void onStop(@NonNull LifecycleOwner owner) {
        Log.d("MyPresenter","onStop");
    }

    @Override
    public void onDestroy(@NonNull LifecycleOwner owner) {
        Log.d("MyPresenter","onDestroy");
    }
}

然后在需要监听的 Activity 中注册:

很简单,一行代码即可

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getLifecycle().addObserver(new MyPresenter());
    }

这样Activity的生命周期就已经可以被MyPresenter观察到了
下面是日志打印:

2023-10-29 22:38:14.982 11952-11952 MyPresenter  com.wang.test              D  onCreate
2023-10-29 22:38:14.985 11952-11952 MyPresenter  com.wang.test              D  onStart
2023-10-29 22:38:14.986 11952-11952 MyPresenter  com.wang.test              D  onResume
2023-10-29 22:38:16.297 11952-11952 MyPresenter  com.wang.test              D  onPause
2023-10-29 22:38:16.887 11952-11952 MyPresenter  com.wang.test              D  onStop
2023-10-29 22:38:16.889 11952-11952 MyPresenter  com.wang.test              D  onDestroy

使用方式1:让要感知Activity生命周期的类实现LifecycleEventObserver接口
注意:(可以接收任何生命周期更改并将其调度给接收方的类。如果一个类同时实现了这个接口和 DefaultLifecycleObserver,那么首先会调用 DefaultLifecycleObserver 的方法,然后调用 onStateChanged

首先让MyObserver实现DefaultLifecycleObserver接口

public class MyObserver implements LifecycleEventObserver {             
                                                                        
                                                                        
    @Override                                                           
    public void onStateChanged(@NonNull LifecycleOwner source, @NonNull 
              switch (event){                                           
                  case ON_CREATE:                                       
                      Log.d("MyObserver","ON_CREATE") ;                 
                      break;                                            
                  case ON_START:                                        
                      Log.d("MyObserver","ON_START") ;                  
                      break;                                            
                  case ON_RESUME:                                       
                      Log.d("MyObserver","ON_RESUME") ;                 
                      break;                                            
                  case ON_PAUSE:                                        
                      Log.d("MyObserver","ON_PAUSE") ;                  
                      break;                                            
                  case ON_STOP:                                         
                      Log.d("MyObserver","ON_STOP") ;                   
                      break;                                            
                  case ON_DESTROY:                                      
                      Log.d("MyObserver","ON_DESTROY") ;                
                      break;                                                                                      
              }                                                         

然后也是在Activity里注册即可,下面是日志打印

2023-10-29 22:46:21.088 12099-12099 MyObserver        com.wang.test              D  ON_CREATE
2023-10-29 22:46:21.097 12099-12099 MyObserver        com.wang.test              D  ON_START
2023-10-29 22:46:21.099 12099-12099 MyObserver        com.wang.test              D  ON_RESUME
2023-10-29 22:47:58.836 12099-12099 MyObserver        com.wang.test              D  ON_PAUSE
2023-10-29 22:47:59.987 12099-12099 MyObserver        com.wang.test              D  ON_STOP
2023-10-29 22:47:59.989 12099-12099 MyObserver        com.wang.test              D  ON_DESTROY
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值