前言

利用 ActivityLifecycleCallbacks/FragmentLifecycleCallbacks 结合 Lifecycle 实现对 Activity/Fragment 生命周期的监听。
首先,Google 新推出的 Android Architecture Components 真的很赞,规范了 Android 开发的架构,是实现 MVVM 的一大利器。MVVMArms 应运而生。
其中,Android Architecture Components 中的 Lifecycle 开发包解决了生命周期的一大难题,在简单使用并分析了源码后,自己动手做了个创新。

为什么要创新

先来一张官方图片:

lifecycle-states
lifecycle-states

查看 Lifecycle 的 官方介绍 和源码可以得知,
Lifecycle.Event 中的 ON_CREATE/ON_START/ON_RESUME 是在对应的生命周期执行完之后才被调用的,
ON_PAUSE/ON_STOP/ON_DESTROY 是在对应的生命周期执行完之前才被调用的。
而我们知道,Application.ActivityLifecycleCallbacks 是在 Activity 对应生命周期 super 之前调用的,
如果我们想做一些框架的初始化操作,使用 Lifecycle 就会遇到一些瓶颈。比如 Dagger 的注入,我们可以放在 Activity 的 OnCreate() 方法之前,或者 Fragment 的 onAttach() 去执行。

注意:ActivityLifecycleCallbacks 里的方法是在 Activity 对应生命周期的 super() 方法中进行的。
FragmentLifecycleCallbacks 里的方法是在 Fragment 对应生命周期方法全部执行完毕后后调用的。

所以在此做了一下封装,在体验 Lifecycle 开发包的同时,能改进其中的“不足”。
其实,Lifecycle 设计的初衷就是为了将一些诸如 LocationListener 之类的监听从 Activity/Fragment 中分离出来;
这里我们做一下改进,让它完美为 MVVMArms 服务。

怎么使用

Activity

如果只想监听 Activity 的生命周期,打印一下对应的 log,只需要在 Application 中添加一句代码:

//Register DEFAULT Activity Lifecycle
ArmsLifecycle.INSTANCE.registerActivityLifecycle(this);

如果想通过监听生命周期的回调做一些自己的业务逻辑,可以通过暴露的接口,重写其中的方法即可,示例如下:

//Register CUSTOM Activity Lifecycle
ArmsLifecycle.INSTANCE.registerActivityLifecycle(this, new ActivityLifecycleObserver() {
    @Override
    public void onAny(LifecycleOwner owner, Lifecycle.Event event) {
        //                super.onAny(owner, event);
        //do something
    }
});

Unregister

可以在 Application 的 onTerminate() 中注销:

//Unregister ALL of Activity Lifecycle
ArmsLifecycle.INSTANCE.clearActivityLifecycle(this);

Fragment

如果只想监听 Fragment 的生命周期,打印一下对应的 log,只需要在 Activity 中添加一句代码,当然也可以写在上一步自定义的 ActivityLifecycleObserver 中:

//Register DEFAULT Fragment Lifecycle
ArmsLifecycle.INSTANCE.registerFragmentLifecycle(this);

如果想通过监听生命周期的回调做一些自己的业务逻辑,可以通过暴露的接口,重写其中的方法即可,示例如下:

//Register CUSTOM Fragment Lifecycle
ArmsLifecycle.INSTANCE.registerFragmentLifecycle(this, new FragmentLifecycleObserver() {
    @Override
    public void onAny(LifecycleOwner owner, Lifecycle.Event event) {
        //                super.onAny(owner, event);
        //do something
    }
});

这里需要特别说明的是,FragmentLifecycleCallbacks 会在 FragmentManager 销毁的时候被系统自动注销,所以不需要我们去手动注销。

FragmentManager#unregisterFragmentLifecycleCallbacks

LifecycleRegistryOwner

因为是结合的 Android Architecture Components 的 Lifecycle,所以需要 Activity/Fragment 实现 LifecycleRegistryOwner,这样 Activity/Fragment 就变成了一个 LifecycleOwner,就可以监听它的生命周期了。
虽然 Lifecycle 包中有一个默认实现 LifecycleActivity/LifecycleFragment,但是通过接口的方式更加灵活。
详情可查看 官方文档

创新点

自从接触到 ActivityLifecycleCallbacks/FragmentLifecycleCallbacks 就有点相见恨晚的感觉,这次 Android Architecture Components 的推出是 Android 开发的一大进步。
在学习了其中的 Lifecycle 部分后,突发奇想,想自己动手改进一下,这样可以提前监听到 Activity 生命周期的回调,并且为 Fragment 的生命周期增加了 onAttach(),解决了 Lifecycle 的不足之处。
如有不足之处,欢迎各位指正。

Github

AndroidLifecycle

MVVMArms

参考文章

Handling Lifecycles