【Android】【框架】【Jetpack】【Architecture】【Lifecycle】

接入

// 非 androidX 项目
implementation "android.arch.lifecycle:runtime:1.1.1"
annotationProcessor "android.arch.lifecycle:compiler:1.1.1"

// androidX 项目
implementation "androidx.lifecycle:lifecycle-runtime:2.0.0"
implementation "androidx.lifecycle:lifecycle-extensions:2.0.0"
implementation "androidx.lifecycle:lifecycle-common-java8:2.0.0"
annotationProcessor  "androidx.lifecycle:lifecycle-compiler:2.0.0"

使用

public class MyObserver implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate() {}

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart() {}

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {}

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {}

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop() {}

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {}
}

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getLifecycle().addObserver(new MyObserver());
    }
}

原理分析

编译时扫描OnLifecycleEvent注解,缓存类、方法路径
基类Activity默认会创建一个LifecycleRegistry,getLifecycle可以获取到
在Activity不同的生命周期,会调用比如this.mLifecycleRegistry.markState(State.CREATED)更新状态
通过LifecycleRegistry发布通知
根据注解去匹配方法,调用对应方法
这也是一种观察者
可以看到Jetpack系列组件大量使用了编译器行为、观察者、面向数据等手段在简化代码

一点思考

1、有点美中不足的地方

@SuppressWarnings("unused")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnLifecycleEvent {
    Lifecycle.Event value();
}

public enum Event {
        ON_CREATE,
        ON_START,
        ON_RESUME,
        ON_PAUSE,
        ON_STOP,
        ON_DESTROY,
        ON_ANY
    }

该注解仅支持这些行为
其实应该支持更多行为的
比如自己希望定制一些行为,也可以使用这个框架
所以注解的参数应该是String类型的,这样可配置

2、生命周期MVP
MVP需要结合生命周期,很多时候,这是刚性的需求
所以可以让Presenter实现LifecycleObserver接口即可,十分方便

3、有个类似的registerActivityLifecycleCallback
它其实也是监控Activity、Fragmeent的生命周期,而且是全局的
有个需求我需要改的东西在三方库组件内,最后和同事评估了下,打算通过registerActivityLifecycleCallback去做,最终十分方便地解决了问题
建议它和Jetpack Lifecycle一同使用,可以解决大部分场景的问题

后记

有什么写得错误、让人费解或遗漏的地方,希望可以不吝赐教,我会马上更改

学习自

https://mp.weixin.qq.com/s/G0GaRAV6F1qKgbGJbbhWjw