您的位置:首页 > 移动开发

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

2018-04-03 10:54 609 查看

一、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;
}<
4000
/pre>
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的方法来做这些操作,总体来说也是可以实现的,只是没有这种感觉会高大上的样子,哪种方法更帅呢,取决于您。文章到处结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息