2020年了你还不会JetPack之LifeCycle

LifeCycle简介及使用场景

JetPack架构组件之一,谷歌爸爸官方出品,方便开发者管理Activity或者Fragment的生命周期,所谓管理,其实就是我们需要在生命周期方法里做写很多重复的业务逻辑,譬如一个项目有100个Activity+200个fragment,现在有个需求是要在他们的生命周期方法onResume或者onPause里埋个点做个记录,这时我们以前的做法大多是在BaseActivity或者BaseFragment里操作不就完事了吗?但是我要让你在其中50个Activity和30个Fragment里卖点,那是不是在Base里写不是很科学,等于代码侵入了。所以为了应对此类操作之一的骚业务操作,谷歌出品了LifeCycle。

LifeCycle使用

这里Demo很简单,业务逻辑是记录下100个Activity的onResume和onPause时的状态。(这里写出一个MainActivity的代码)
涉及的类:LogUtil.class、MainActivity.class

  • LogUtil.class
public class LogUtil implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void insertLogWithResume() {
        Log.i("jetPack", "onResume");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void insertLogWithPause() {
        Log.i("jetPack", "onPause");
    }
}
  • MainActivity.class
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getLifecycle().addObserver(new LogUtil());
    }
}
  • 结果
    在这里插入图片描述
  • 说明:
  1. 创建LogUtil类实现LifecycleObserver接口。
  2. Demo里实现了两个方法insertLogWithResume()和insertLogWithPause()方法,分别注册@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)和 @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE),从名字不难看出,这就是代表着对应的生命周期方法。
  3. Lifecycle.Event.目前包括以下几种:
    在这里插入图片描述
  4. 最后只要在Activity的onCreate方法用getLifecycle().addObserver()进行关联即可。

LifeCycle原理

采用观察者模式

  1. 点击MainActivity中的getLifecycle()进到FragmentActivity.class
 @Override
    public Lifecycle getLifecycle() {
        return super.getLifecycle();
    }
  1. 点击super.getLifecycle()进到ComponentActivity
@Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

发现最终返回的是mLifecycleRegistry。

private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

所以关键类是LifecycleRegistry

  1. LifecycleRegistry类的关键handleLifecycleEvent
  /**
     * Sets the current state and notifies the observers.
     * <p>
     * Note that if the {@code currentState} is the same state as the last call to this method,
     * calling this method has no effect.
     *
     * @param event The event that was received
     */
    public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        State next = getStateAfter(event);
        moveToState(next);
    }
  1. 最后发现会在Fragment和ReportFragment里的生命周期方法进行dispatch

在这里插入图片描述
Fragment.class

 void performResume() {
        /···省略代码···/
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
        if (mView != null) {
            mViewLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
        }
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值