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

Application中ActivityLifecycleCallbacks的原理分析

2016-11-10 21:34 471 查看
ActivityLifecycleCallbacks是Application中的一个接口,既然是在Application中,不得不说说Application类,别急,一个个来说道说道

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);
}有很多方法声明,仔细一看,很熟悉啊,没错,这些方法与Activity的整个生命周期相关,而且,通过命名,可以大体猜测,这些方法会在Activity周期方法调用完后被执行
接下来,看看Application中还有哪儿些与ActivityLifecycleCallbacks相关的,代码如下:

public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
synchronized (mActivityLifecycleCallbacks) {
mActivityLifecycleCallbacks.add(callback);
}
}

public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
synchronized (mActivityLifecycleCallbacks) {
mActivityLifecycleCallbacks.remove(callback);
}
}这里,两个方法,一个注册ActivityLifecycleCallbacks,一个反注册ActivityLifecycleCallbacks,还有一个mActivityLifecycleCallbacks,可以看出是个成员变量
在Application中定义mActivityLifecycleCallbacks,代码如下:

private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = new ArrayList<ActivityLifecycleCallbacks>();继续阅读,会发现如下方法:
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);
}
}
}

void dispatchActivityStarted(Activity activity) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
((ActivityLifecycleCallbacks)callbacks[i]).onActivityStarted(activity);
}
}
}

void dispatchActivityResumed(Activity activity) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
((ActivityLifecycleCallbacks)callbacks[i]).onActivityResumed(activity);
}
}
}

void dispatchActivityPaused(Activity activity) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
((ActivityLifecycleCallbacks)callbacks[i]).onActivityPaused(activity);
}
}
}

void dispatchActivityStopped(Activity activity) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
((ActivityLifecycleCallbacks)callbacks[i]).onActivityStopped(activity);
}
}
}

void dispatchActivitySaveInstanceState(Activity activity, Bundle outState) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
((ActivityLifecycleCallbacks)callbacks[i]).onActivitySaveInstanceState(activity,
outState);
}
}
}

void dispatchActivityDestroyed(Activity activity) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
((ActivityLifecycleCallbacks)callbacks[i]).onActivityDestroyed(activity);
}
}
}以上这些方法,都有个共同点,就是调用了collectActivityLifecycleCallbacks方法,而且遍历callbacks,类型转换为ActivityLifecycleCallbacks,回调其方法
collectActivityLifecycleCallbacks方法做了什么呢?将list转化为数组,代码如下:

private ArrayList<ComponentCallbacks> mComponentCallbacks = new ArrayList<ComponentCallbacks>();
private Object[] collectComponentCallbacks() {
Object[] callbacks = null;
synchronized (mComponentCallbacks) {
if (mComponentCallbacks.size() > 0) {
callbacks = mComponentCallbacks.toArray();
}
}
return callbacks;
}那么问题来了,Applicatipn中的dispatchActivityXXX的这些方法,是谁调用呢?
如果对Activity源码了解的话,很容易发现如下代码:

protected void onCreate(@Nullable Bundle savedInstanceState) {
//省略
<pre name="code" class="java"> getApplication().dispatchActivityCreated(this, savedInstanceState);
//... }
protected void onStart() {
//...
getApplication().dispatchActivityStarted(this);
}
protected void onResume() {
//...
getApplication().dispatchActivityResumed(this);
//...
}


onPause(),onStop(),onDestroy(),同样调用getApplication().dispatchActivityPaused(this)

整理整个执行过程:

        需要定义一个类A,实现ActivityLifecycleCallbacks,并且实现接口方法

        registerActivityLifecycleCallbacks注册类A对象,

        系统调用Activity的attach方法,绑定Application上下文,

        系统调用Activity生命周期方法,相应的调用Application中的dispatchActivityXXX方法,dispatchActivityXXX方法内部,回调A对象中方法的具体实现,从而完成,对Activity生命周期完整的跟踪监听

优点:官方提供对Activity生命周期的统一监听,避免代码在某类中的显示调用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息