ActivityLifecycleCallbacks的原理分析
在Activity生命周期监听ActivityLifecycleCallbacks中了解到ActivityLifecycleCallbacks用来监控Activity的生命周期,它的实现原理也不难,在框架中新增接口及相关的回调即可。现在来分析一下其中的原理。
1、mActivityLifecycleCallbacks集合
在Application中调用registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback)方法注册ActivityLifecycleCallbacks 回调
public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
synchronized (mActivityLifecycleCallbacks) {
mActivityLifecycleCallbacks.add(callback);
}
}
这里mActivityLifecycleCallbacks是Application类中的集合类型成员变量,注册的实例会被添加到该集合中
@UnsupportedAppUsage
private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = new ArrayList<ActivityLifecycleCallbacks>();
2、collectActivityLifecycleCallbacks()方法
mActivityLifecycleCallbacks除了在声明和添加移除修改数据集合的地方,还有另一个方法中被访问:collectActivityLifecycleCallbacks()
@UnsupportedAppUsage
private Object[] collectActivityLifecycleCallbacks() {
Object[] callbacks = null;
synchronized (mActivityLifecycleCallbacks) {
if (mActivityLifecycleCallbacks.size() > 0) {
callbacks = mActivityLifecycleCallbacks.toArray();
}
}
return callbacks;
}
将mActivityLifecycleCallbacks集合转成Object[]数组,在下面21个dispatchActivity***()回调方法中被调用(共7组不同生命周期的回调,每组3个回调方法:前中后)
// ------------------ Internal API ------------------
@UnsupportedAppUsage
void dispatchActivityPreCreated(@NonNull Activity activity,
@Nullable Bundle savedInstanceState) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i = 0; i < callbacks.length; i++) {
((ActivityLifecycleCallbacks) callbacks[i]).onActivityPreCreated(activity,
savedInstanceState);
}
}
}
@UnsupportedAppUsage
void dispatchActivityCreated(@NonNull Activity activity,
@Nullable Bundle savedInstanceState) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
savedInstanceState);
}
}
}
@UnsupportedAppUsage
void dispatchActivityPostCreated(@NonNull Activity activity,
@Nullable Bundle savedInstanceState) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i = 0; i < callbacks.length; i++) {
((ActivityLifecycleCallbacks) callbacks[i]).onActivityPostCreated(activity,
savedInstanceState);
}
}
}
...
3、dispatchActivity流程
3.1、dispatchActivityCreated
来看看Application的dispatchActivityCreated(Activity activity,Bundle savedInstanceState)方法在哪里被回调的,之前有看过Activity初始化流程,详见Activity启动流程源码分析。在Activity的onCreate()方法中
@MainThread
@CallSuper
protected void onCreate(@Nullable Bundle savedInstanceState) {
...
mFragments.dispatchCreate();
dispatchActivityCreated(savedInstanceState);
...
}
调用Activity中的dispatchActivityCreated(Bundle savedInstanceState)方法,在这里进行ActivityLifecycleCallbacks的回调分发。
private void dispatchActivityCreated(@Nullable Bundle savedInstanceState) {
getApplication().dispatchActivityCreated(this, savedInstanceState);
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i = 0; i < callbacks.length; i++) {
((Application.ActivityLifecycleCallbacks) callbacks[i]).onActivityCreated(this,
savedInstanceState);
}
}
}
getApplication()获取的就是当前Application,Activity初始化的时候会持有当前的Application引用。调用Application的dispatchActivityCreated(Activity activity, Bundle savedInstanceState)方法,前面提到过,在这里对注册的ActivityLifecycleCallbacks监听器一个一个执行回调onActivityCreated方法。
@UnsupportedAppUsage
/* package */ void dispatchActivityCreated(@NonNull Activity activity,
@Nullable Bundle savedInstanceState) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
savedInstanceState);
}
}
}
值得注意的是,Activity也新增了mActivityLifecycleCallbacks集合,并且支持在Activity中进行注册和反注册。这是从API 29才开始的。
3.2、dispatchActivityPreCreated/dispatchActivityPostCreated
那么dispatchActivityPreCreated和dispatchActivityPostCreated又是在哪里回调的呢?这就看源码哪里开始创建Activity的:
@UnsupportedAppUsage
final void performCreate(Bundle icicle, PersistableBundle persistentState) {
dispatchActivityPreCreated(icicle); //================= dispatchActivityPre
mCanEnterPictureInPicture = true;
restoreHasCurrentPermissionRequest(icicle);
if (persistentState != null) {
onCreate(icicle, persistentState);
} else { //================== dispatchActivity
onCreate(icicle);
}
writeEventLog(LOG_AM_ON_CREATE_CALLED, "performCreate");
mActivityTransitionState.readState(icicle);
mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
com.android.internal.R.styleable.Window_windowNoDisplay, false);
mFragments.dispatchActivityCreated();
mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions());
dispatchActivityPostCreated(icicle); //================ dispatchActivityPost
}
Activity创建的时候被Instrumentation类callActivityOnCreate(Activity activity, Bundle icicle)方法调用
public void callActivityOnCreate(Activity activity, Bundle icicle) {
prePerformCreate(activity);
activity.performCreate(icicle);
postPerformCreate(activity);
}
调用Activity的performCreate()方法,Android框架在新增回调接口的时候选择了最合适的位置进行“插桩”,在该方法中的开始、中间和结束分别分发回调:
dispatchActivityPre -> dispatchActivity -> dispatchActivityPost