Android Lifecycles 生命周期感知

前言

为什么要让组件感知生命周期?

Android中大多数应用程序组件都附带有生命周期。 生命周期由操作系统或你使用的框架管理。 生命周期是Android核心而基础的东西,如果不按照生命周期写代码,可能会触发内存泄漏甚至是应用程序崩溃。

而在Api26.1.0之前,自定义UI控件或其他的组件的生命周期都是由我们手动管理的。如果我们让这些组件和Activity/Fragment 一样具有生命周期。那么我们将不用在Activity/Fragment中同步组件的生命周期事件。

例子

举个例子。如果我们想要获取位置信息,常见的写法是这个样子的:

class MyLocationListener {
    public MyLocationListener(Context context, Callback callback) {
        // ...
    }

    void start() {
        // connect to system location service
    }

    void stop() {
        // disconnect from system location service
    }
}

class MyActivity extends AppCompatActivity {
    private MyLocationListener myLocationListener;

    @Override
    public void onCreate(...) {
        myLocationListener = new MyLocationListener(this, (location) -> {
            // update UI
        });
    }

    @Override
    public void onStart() {
        super.onStart();
        myLocationListener.start();
        // 管理其他依赖生命周期的组件 ...
    }

    @Override
    public void onStop() {
        super.onStop();
        myLocationListener.stop();
        // 管理其他依赖生命周期的组件 ...
    }
}

这样写没毛病。但是如果有很多组件,Activity中会有大量维护生命周期的代码。使代码难以维护。

而使用Lifecycle后,代码是这样子的:

class MyLocationListener implements LifecycleObserver {

    public MyLocationListener(Context context, Lifecycle lifecycle, Callback callback) {
       ...
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void start() {
        // connect to system location service
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void stop() {
        // disconnect if connected
    }
}

class MyActivity extends AppCompatActivity {
    private MyLocationListener myLocationListener;

    public void onCreate(...) {
        myLocationListener = new MyLocationListener(this, getLifecycle(), location -> {
            // update UI
        });
        getLifecycle().addObserver(myLocationListener)
    }
}

Activity里将不再处理mLocationListener的生命周期,mLocationListener的生命周期将由Lifecycle来管理。现在我们只需要在onCreate()时把需要感知生命周期的组件添加到Lifecycle中,Lifecycle将根据注解在Activity生命周期改变时自行回调我们对应的方法。

Lifecycle

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

Lifecycle主要使用两个枚举来跟踪其关联组件的生命周期状态:

  • Event

    Lifecycle.Event事件 从frameworkLifecycle分发。这些事件和Activity/Fragment中的生命周期对应。

  • State

    根据Lifecycle对象来获取当前状态
    这里写图片描述

在上面的例子中,我们写的MyLocationListener实现了LifecycleObserver接口,并且使用了@OnLifecycleEvent注解。在Activity里面我们把myLocationListener添加到了 观察者列表。

  • LifecycleObserver 接口

    这是一个空接口,就标记一下这个类是具有生命周期意识的。

  • OnLifecycleEvent注解

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)

    注解参数为Lifecycle.Event枚举,这些枚举和Activity/Fragment生命周期对应。被注解的方法将在对应生命周期被回调。

  • Activity 添加生命周期观察

    Api26.1.0起,SupportActivity默认实现 了LifecycleOwner接口。也就是说,如果我们使用Api26.1.0或以上的版本,我们可以直接使用 getLifecycle().addObserver()

    这里写图片描述

    从Activity的继承关系看,我们默认使用的AppCompatActivity也是可以直接使用的。如果你的Activity直接继承自Activity,那么通过实现LifecycleOwner来达到相同的效果:
    “`java
    public class MyActivity extends Activity implements LifecycleOwner {
    private LifecycleRegistry mLifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mLifecycleRegistry = new LifecycleRegistry(this);
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
        // 其他代码同例子
    }
    
    @Override
    public void onStart() {
        super.onStart();
        mLifecycleRegistry.markState(Lifecycle.State.STARTED);
    }
    
    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
    

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值