App啓動(三)Activity的創建

上一篇我們講到AMS在被遠程調用attachApplication方法後,會在attachApplicationLocked方法裏遠程調用ApplicationThreadbindApplication創建Application對象。實際上attachApplicationLocked方法不止進行了Application對象的創建在創建完Application對象後還進行了Activity的創建,我們這次多看一點它的源碼

1.ActivityManagerService#attachApplicationLocked

private final boolean attachApplicationLocked(IApplicationThread thread,
            int pid) {

        ......

        try {
        ......
            //1.發送啓動Application
            thread.bindApplication(...);
        ......
        } catch (Exception e) {
        ......
            return false;
        }
        ......
        if (normalMode) {
            try {
                //2.啓動activity
                if (mStackSupervisor.attachApplicationLocked(app)) {
                    didSomething = true;
                }
            } catch (Exception e) {
                ...
            }
        }

        ......

        return true;
    }

可以看到它執行了mStackSupervisor.attachApplicationLocked(app)方法去創建一個ActivitymStackSupervisor是一個ActivityStackSupervisor類型的對象,下面看該方法的源碼

boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
    ... 
    try {
        //調用realStartActivityLocked方法真正啓動activity
        if (realStartActivityLocked(hr, app, true, true)) {
            didSomething = true;
        }
    } catch (RemoteException e) {
	...
    }
    ...
	return didSomething;
}

接下來是realStartActivityLocked方法

final boolean realStartActivityLocked(ActivityRecord r,
            ProcessRecord app, boolean andResume, boolean checkConfig)
            throws RemoteException {
    ......
    try {
        ......
        app.thread.scheduleLaunchActivity(...);
        ......
    } catch (RemoteException e) {
        ......
    }
    ......
    return true;
}

可以看到最後通過調用app.thread.scheduleLaunchActivity方法進行創建Activity,而app.thread就是

之前講的mAppThread對象的Binder代理對象,也就是說此時AMS又通過Binder機制遠程調用了ApplicationThreadscheduleLaunchActivity方法去進行Activity創建。

2.ApplicationThread#scheduleLaunchActivity方法

@Override
        public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
                ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
                CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
                int procState, Bundle state, PersistableBundle persistentState,
                List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
                boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {
     ...
     //將消息交給H類型的mH處理
     sendMessage(H.LAUNCH_ACTIVITY, r);
}

可以看到Application的創建一樣,通過Handler機制發送了H.LAUNCH_ACTIVITY消息交給了H類進行分發處理,而實際上H類將其交給ActivityThreadhandleLaunchActivity方法進行處理

3.ActivityThread#handleLaunchActivity

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ......
    //1.執行Activity的初始化及oncreate方法
    Activity a = performLaunchActivity(r, customIntent);

    if (a != null) {
        ......
        //2.執行Activity的onResume方法
        handleResumeActivity(r.token, false, r.isForward,!r.activity.mFinished && !r.startsNotResumed);
        ......
    } else {
        ......
    }
   
}

實際的Activity創建是交給performLaunchActivity方法處理的

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
    ......
    Activity activity = null;
    try {
        ...
        //1.創建activity
        activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
        ...
        } catch (Exception e) {
            ...
        }

    try {
        //2.創建Application,實質上Application已經創建,只是獲得已有的Application 實例
        Application app = r.packageInfo.makeApplication(false, mInstrumentation);
        ......
        if (activity != null) {
            //3.創建context
            Context appContext = createBaseContextForActivity(r, activity);
            ......
            //4.將Context和Application 與activity關聯起來,完成activity的初始化
             activity.attach(appContext, this, getInstrumentation(), r.token,
                        r.ident, app, r.intent, r.activityInfo, title, r.parent,
                        r.embeddedID, r.lastNonConfigurationInstances, config,
                        r.referrer, r.voiceInteractor);
            //5.調用activity的oncreate方法
            if (r.isPersistable()) {
                mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
            } else {
                mInstrumentation.callActivityOnCreate(activity, r.state);
            }
            ......
        } catch (SuperNotCalledException e) {
            ...
        }
        return activity;
    }

實際創建 Activity 這裏還是使用 Instrumentation 的對象,而mInstrumentation.newActivity方法跟

newApplication方法一樣用反射創建出Activity

創建出ActivityperformLaunchActivity 方法開始使用mInstrumentation 調用 Activity的聲onCreate生命週期

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章