一、ActivityLifecycleCallbacks接口介绍
API 14之后,在Application类中,提供了一个应用生命周期回调的注册方法,用来对应用的生命周期进行集中管理,这个接口叫registerActivityLifecycleCallbacks,可以通过它注册自己的ActivityLifeCycleCallback,每一个Activity的生命周期都会回调到这里的对应方法。之前我们想做类似限制制定Activity个数的时候都要自己去添加和计数,有了ActivityLifeCycleCallback接口,所有Activity的生命周期都会在这里回调,我们可以根据条件随心处理。
用ActivityLifecycleCallbacks实现判断应用是否处于前台
回到我们最开始的时候如何统计程序的前台停留时间,其实我们只要在自定义的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的方法来做这些操作,总体来说也是可以实现的,只是没有这种感觉会高大上的样子,哪种方法更帅呢,取决于您。文章到处结束。