使用ActivityLifecycleCallbacks管理Activity和区分App前后台

一、ActivityLifecycleCallbacks接口介绍

API 14之后,在Application类中,提供了一个应用生命周期回调的注册方法,用来对应用的生命周期进行集中管理,这个接口叫registerActivityLifecycleCallbacks,可以通过它注册自己的ActivityLifeCycleCallback,每一个Activity的生命周期都会回调到这里的对应方法。之前我们想做类似限制制定Activity个数的时候都要自己去添加和计数,有了ActivityLifeCycleCallback接口,所有Activity的生命周期都会在这里回调,我们可以根据条件随心处理。

用ActivityLifecycleCallbacks实现判断应用是否处于前台

使用ActivityLifecycleCallbacks管理Activity和区分App前后台

回到我们最开始的时候如何统计程序的前台停留时间,其实我们只要在自定义的Application中定一个全局的静态变量mActivityCount= 0,如果一个Activity启动的话,则在onActivityStarted方法中mActivityCount++,然后在onActivityStopped()方法中mActivityCount–,最后在onActivityStopped的时候判断一下mActivityCount是否等于0表示程序完全退出前台了,还有一种可能就是直接按Home键将程序切换到后台,这个时候你就需要单独的去处理了。其实ActivityLifecycleCallbacks 内部实现是非常简单的,只是在Activity中各个生命周期中调用了接口回调函数,然后Application中定义了接口回调的集合用于保存各个注册的接口。这样子我们定义n多个接口回调,然后分别去分发这些具体的函数。

我们去找一下是在什么时候回调的comeOn。这是Activity的onCreate方法

protected void onCreate(@Nullable Bundle savedInstanceState) {
    ......省略代码   这就是在Activity的onCreate方法的回调
    getApplication().dispatchActivityCreated(this, savedInstanceState);
    .....省略代码
}

其实其他的生命周期方式是类似的就不在贴出来的,我们下面看下这个dispatchActivityCreate的实现,

/* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
    Object[] callbacks = collectActivityLifecycleCallbacks();
    if (callbacks != null) {
        for (int i=0; i<callbacks.length; i++) {
            ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                    savedInstanceState);
        }
    }
}
来看下这个callbacks是什么神奇的东西
private Object[] collectActivityLifecycleCallbacks() {
    Object[] callbacks = null;
    synchronized (mActivityLifecycleCallbacks) {
        if (mActivityLifecycleCallbacks.size() > 0) {
            callbacks = mActivityLifecycleCallbacks.toArray();
        }
    }
    return callbacks;
}
private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =
        new ArrayList<ActivityLifecycleCallbacks>();
public interface ActivityLifecycleCallbacks {
    void onActivityCreated(Activity activity, Bundle savedInstanceState);
    void onActivityStarted(Activity activity);
    void onActivityResumed(Activity activity);
    void onActivityPaused(Activity activity);
    void onActivityStopped(Activity activity);
    void onActivitySaveInstanceState(Activity activity, Bundle outState);
    void onActivityDestroyed(Activity activity);
}

对这就是我们要找的ActivityLifecycleCallbacks。到这就把ActivityLifecycleCallbacks的原理底层代码已经介绍清楚了。

下面我们在来搞个Activity生命周期的管理,我们可以用一个List来保存打开的Activity,在onActivityCreated的方法中把Activity保存到List中,当onActivityDestroyed中把Activity移除List集合,我们可以在Application中提供一个方法来关闭所有的Activity,这样在退出应用的时候就可以实现来关闭所有的Activity了。如果我们不用这种方法就要在BaseActivity中的onCreate的方法来做这些操作,总体来说也是可以实现的,只是没有这种感觉会高大上的样子,哪种方法更帅呢,取决于您。文章到处结束。