Jetpack成员表之Lifecycle应用及源码解析

Jetpack里面的内容还是相当丰富了,有兴趣的可以去官网了解一番。

Jetpack成员图.jpeg

这里讲到的是 Lifecycle,中文意思就是生命周期。如果说你想让某一个类能够观察
Activity 或 Fragment 的生命周期,那 Lifecycle 可以很轻松的帮你实现。有用过 MVP模式的话,你应该经常需要 Presenter 感知 View(Activity/Frament 统称 View) 的生命周期,以便处理业务逻辑。当你没接触 Lifecycle 的时候,获取会通过接口的方式通知 Presenter,例如以下代码:
1.定义一个接口:

public interface ILifecycleView {
    void onCreate();

    void onStart();

    void onPause();

    void onResume();

    void onDestroy();
}

2.Presenter 代码块:

public class MainPresenter implements ILifecycleView {

    private static final String TAG = "MainPresenter";

    @Override
    public void onCreate() {
        Log.d(TAG, "onCreate");
    }

    @Override
    public void onStart() {
        Log.d(TAG, "onStart");
    }

    @Override
    public void onPause() {
        Log.d(TAG, "onPause");
    }

    @Override
    public void onResume() {
        Log.d(TAG, "onResume");
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
    }
}

3.View 代码块:

public class MainActivity extends AppCompatActivity {

    private MainPresenter mainPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mainPresenter = new MainPresenter();
        mainPresenter.onCreate();
    }

    @Override
    protected void onStart() {
        super.onStart();
        mainPresenter.onStart();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mainPresenter.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mainPresenter.onResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mainPresenter.onDestroy();
    }
}

这样 Presenter 也能轻监听到View的生命周期,其实这并不是那么轻松,当 Presenter 有很多的时候你就会有感觉了,所以 Lifecycle 就能派上用场了。还是看代码

1.Lifrcycle简单应用

public class MainPresenter implements DefaultLifecycleObserver {

    private final static String TAG = "MainPresenter";

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

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

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

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

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

    @Override
    public void onDestroy(@NonNull LifecycleOwner owner) {
        Log.d(TAG, "onDestroy");
    }
}
public class MainActivity extends AppCompatActivity {

    private MainPresenter mainPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mainPresenter = new MainPresenter();
        getLifecycle().addObserver(mainPresenter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getLifecycle().removeObserver(mainPresenter);
    }
}

运行结果GIF:


20190818_174058.gif

让 Presenter 具有感知生命周期的能力变得更加简单了,只需要两步:

1.Presenter 实现 DefaultLifecycleObserver(DefaultLifecycleObserver 是 LifecycleObserver 的一个实现接口,稍后会讲解到)
2.在 Activity 中调用 getLifecycle().addObserver(mainPresenter) 将 mainPresenter 传到 Lifecycle 中。

总体来说比前面的方式简单不少,说了这么多,操作起来是方便,但是不懂的人会就会有疑惑,为啥这么写就能让 Presenter 感知View的生命周期呢?看看源码就能解开当中的疑惑了。

2.Lifecycle 源码分析

Lifecycle 内部实现原理就是观察者模式,上面的例子 MainPresenter 就是一个观察者,Lifecycle 或者说 View 是被观察者。所以你会看到 MainPresenter 实现了 DefaultLifecycleObserver,该类是 LifecycleObserver 的实现类。

/**
 * Callback interface for listening to {@link LifecycleOwner} state changes.
 * <p>
 * If you use Java 8 language, <b>always</b> prefer it over annotations.
 */
@SuppressWarnings("unused")
public interface DefaultLifecycleObserver extends FullLifecycleObserver {

    /**
     * Notifies that {@code ON_CREATE} event occurred.
     * <p>
     * This method will be called after the {@link LifecycleOwner}'s {@code onCreate}
     * method returns.
     *
     * @param owner the component, whose state was changed
     */
    @Override
    default void onCreate(@NonNull LifecycleOwner owner) {
    }

    /**
     * Notifies that {@code ON_START} event occurred.
     * <p>
     * This method will be called after the {@link LifecycleOwner}'s {@code onStart} method returns.
     *
     * @param owner the component, whose state was changed
     */
    @Override
    default void onStart(@NonNull LifecycleOwner owner) {
    }
//省略部分源码
}
interface FullLifecycleObserver extends LifecycleObserver {

    void onCreate(LifecycleOwner owner);

    void onStart(LifecycleOwner owner);

    void onResume(LifecycleOwner owner);

    void onPause(LifecycleOwner owner);

    void onStop(LifecycleOwner owner);

    void onDestroy(LifecycleOwner owner);
}
/**
 * Marks a class as a LifecycleObserver. It does not have any methods, instead, relies on
 * {@link OnLifecycleEvent} annotated methods.
 * <p>
 * @see Lifecycle Lifecycle - for samples and usage patterns.
 */
@SuppressWarnings("WeakerAccess")
public interface LifecycleObserver {

}

从源码可以看出 DefaultLifecycleObserver 只是一个很简单的接口类,每个方法的参数都是 LifecycleOwner ,而这个 LifecycleOwner 的源码也很简单 里面只有一个方法用于提供 Lifecycle。

/**
 * A class that has an Android lifecycle. These events can be used by custom components to
 * handle lifecycle changes without implementing any code inside the Activity or the Fragment.
 *
 * @see Lifecycle
 */
@SuppressWarnings({"WeakerAccess", "unused"})
public interface LifecycleOwner {
    /**
     * Returns the Lifecycle of the provider.
     *
     * @return The lifecycle of the provider.
     */
    @NonNull
    Lifecycle getLifecycle();
}

接着看 MainActivity 的 getLifecycle().addObserver(mainPresenter) 这行代码,
getLifecycle() 提供一个 LifecycleRegistry ,具体源码就不贴出来了,这个比较简单。看看 LifecycleRegistry 源码:

/**
 * An implementation of {@link Lifecycle} that can handle multiple observers.
 * <p>
 * It is used by Fragments and Support Library Activities. You can also directly use it if you have
 * a custom LifecycleOwner.
 */
public class LifecycleRegistry extends Lifecycle {

LifecycleRegistry 是 Lifecycle 的实现类,在看看 Lifecycle 源码:

public abstract class Lifecycle {

Lifecycle 是一个抽象类,包含 了两个主要的抽象方法方法

  @MainThread
    public abstract void addObserver(@NonNull LifecycleObserver observer);

 @MainThread
    public abstract void removeObserver(@NonNull LifecycleObserver observer);

这两个就是前面用到的两个方法,添加观察者与移除观察者(防止内存泄漏)。
看看 LifecycleRegistry 对 addObserver() 的实现逻辑


1.png

162行可以看到通过 LifecycleObserver 和 State 生成了一个 ObserverWithState, LifecycleObserver 就是我们的MainPresenter,而 State 是 Lifecycle 里面的枚举


image.png

State 代表当前 View 的生命周期状态, ObserverWithState 是 LifecycleRegistry 的一个静态内部类


image.png

从源码可以看出 View 的生命周期就是通过这个内部类的 dispatchEvent(LifecycleOwner owner, Event event) 方法来通知观察者。整个回调流程如下截图:


image.png

image.png

image.png

image.png

然后到了 ReportFragment 这里


image.png

每个生命周期的函数都会调用 dispatch()方法。
最后终于到了 SupportActivity 了,看截图
image.png

是在这里将 SupportActivity 注入到了 ReportFragment 里。整个通知回调就是这样子了。稍微细心一点你会发现 LifecycleRegistry 是在 SupportActivity 的28行创建的,也就是说如果我们的 MainActivity 是继承 Activity 而不是它的子类的话,是找不到getLifecycle() 这个方法的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,999评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,102评论 1 302
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,709评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,439评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,846评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,881评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,062评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,783评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,517评论 1 248
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,762评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,241评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,236评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,145评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,941评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,965评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,802评论 2 275