1. 程式人生 > >Activity啟動流程【從Launcher點選圖示】和【在Activity中呼叫startActivity()】

Activity啟動流程【從Launcher點選圖示】和【在Activity中呼叫startActivity()】

從Launch程序啟動Application及Activity
Android系統是基於Linux的,所以它的所有應用也是基於Linux的Init程序創建出來的,
首先Init程序啟動Zygote(受精卵)程序,然後再fork出其他程序(包括SystemServer),最後開啟各種應用程序
Zygote孵化的第一個程序是system_server程序,而且孵化的第一個App程序是Launcher,也就是桌面App。
當點選桌面App的時候,發起程序就是Launcher所在的程序,啟動遠端程序,利用Binder傳送訊息給system_server程序;
在system_server程序中啟動了N多服務,例如ActiivityManagerService,WindowManagerService等。
啟動程序的操作會先呼叫AMS.startProcessLocked方法,內部呼叫 Process.start
(android.app.ActivityThread); 而後通過socket通訊告知Zygote程序fork子程序,即app程序。程序建立後將ActivityThread載入進去, 執行ActivityThread.main()方法,如下: 一、ActivityThread.main() 1.初始化主執行緒 Looper.prepareMainLooper(); 2.ActivityThread thread = new ActivityThread(); thread.attach(false); 3.判斷當前主執行緒的Handler是否為空 if (sMainThreadHandler == null
) { sMainThreadHandler = thread.getHandler(); } 4.Looper.loop(); 5.attach(false) IActivityManager mgr = ActivityManagerNative.getDefault(); mgr.attachApplication(mAppThread);//mAppThread--ApplicationThread 二、ActivityManagerNative 6.getDefault()---gDefault.get() IBinder b = ServiceManager.getService("activity"
); IActivityManager am = asInterface(b); return am; 7.getService("activity"); ServiceManager這裡是getService,ActivityManagerService.setSystemProcess()中有個ServiceManager.addService(); //ActivityManagerNative.ActivityManagerProxy 8.asInterface(b)---new ActivityManagerProxy(obj);//"回到6" mRemote = remote;//IBinder 9.mgr.attachApplication(mAppThread)在ActivityManagerNative中//將thread資訊AMS//"回到5" mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, reply, 0);//在system_server程序中,AMS會呼叫ActivityManagerNative.onTransact()//通過Binder程序間通訊進入到ActivityManagerService中 三、ActivityManagerService 10.attachApplication(mAppThread)在ActivityManagerService中//"回到5" attachApplicationLocked(thread, callingPid);//真正的邏輯部分 11.attachApplicationLocked(thread, callingPid)//thread--IApplicationThread thread.bindApplication(); mStackSupervisor.attachApplicationLocked(app)//app--ProcessRecord 四、ActivityThread 12.bindApplication(); sendMessage(H.BIND_APPLICATION, data); 13.handleBindApplication(data); final ContextImpl instrContext = ContextImpl.createAppContext(this, pi); final ClassLoader cl = instrContext.getClassLoader(); Instrumentation mInstrumentation = (Instrumentation) cl.loadClass(data.instrumentationName.getClassName()).newInstance(); Application app = data.info.makeApplication(data.restrictedBackupMode, null); mInstrumentation.callApplicationOnCreate(app);//---app.onCreate(); 五、LoadedApk 14.makeApplication(data.restrictedBackupMode, null); String appClass = mApplicationInfo.className; if (forceDefaultAppClass || (appClass == null)) appClass = "android.app.Application"; ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this); Application app = mActivityThread.mInstrumentation.newApplication(cl, appClass, appContext);//cl--getClassLoader() 六、Instrumentation---管家的角色 15.newApplication(cl, appClass, appContext); newApplication(cl.loadClass(className), context) Application app = (Application)clazz.newInstance();//反射建立,呼叫簡單粗暴,native方法 app.attach(context);//Application被建立後第一個呼叫的方法,目的是為了繫結Context 七、ActivityStackSupervisor 16.attachApplicationLocked(app)//"回到11"(***************************) realStartActivityLocked(hr, app, true, true) app.thread.scheduleLaunchActivity(); 八、ActivityThread 17.scheduleLaunchActivity();//--ApplicationThread sendMessage(H.LAUNCH_ACTIVITY, r);//傳送建立Activity的訊息 18.handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");//處理訊息 Activity a = performLaunchActivity(r, customIntent);//建立並呼叫onCreate(),onStart() handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);//呼叫onResume 19.performLaunchActivity(r, customIntent);//建立並呼叫onCreate(),onStart() java.lang.ClassLoader cl = r.packageInfo.getClassLoader(); Activity activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);//建立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, window); if (r.isPersistable()) {//根據是否可持久化選擇callActivityOnCreate()方法。 mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);//可獲得持久化資料; } else { mInstrumentation.callActivityOnCreate(activity, r.state); } if (!r.activity.mFinished) { activity.performStart();//呼叫onStart r.stopped = false; } if (!r.activity.mFinished) { if (r.isPersistable()) {//根據是否可持久化選擇callActivityOnRestoreInstanceState()方法。 if (r.state != null || r.persistentState != null) { mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state, r.persistentState);//可獲得持久化資料; } } else if (r.state != null) { mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state); } } if (!r.activity.mFinished) { activity.mCalled = false; if (r.isPersistable()) {//根據是否可持久化選擇callActivityOnCreate()方法。 mInstrumentation.callActivityOnPostCreate(activity, r.state, r.persistentState);//可獲得持久化資料; } else { mInstrumentation.callActivityOnPostCreate(activity, r.state); } ... } 九、Instrumentation 20.newActivity(cl, component.getClassName(), r.intent);//建立Activity (Activity)cl.loadClass(className).newInstance();//反射建立,呼叫native方法 21.callActivityOnCreate(); activity.performCreate(icicle);/activity.performCreate(icicle, persistentState); onCreate(icicle)//平時重寫的最多的;/onCreate(icicle, persistentState)//可獲得持久化資料; 22.callActivityOnRestoreInstanceState(); activity.performRestoreInstanceState(savedInstanceState);/activity.performRestoreInstanceState(savedInstanceState, persistentState); 23.callActivityOnPostCreate(); activity.onPostCreate(icicle);/activity.onPostCreate(icicle, persistentState); 十、Activity 24.performRestoreInstanceState(); onRestoreInstanceState(savedInstanceState);/onRestoreInstanceState(savedInstanceState, persistentState); 25.onPostCreate(); onPostCreate(savedInstanceState); if (!isChild()) { mTitleReady = true; onTitleChanged(getTitle(), getTitleColor()); } mCalled = true; 26.performStart();//呼叫onStart mInstrumentation.callActivityOnStart(this);---activity.onStart(); 十一、ActivityThread 27.handleResumeActivity();“回到18” r = performResumeActivity(token, clearHide, reason); r.activity.performResume(); 十二、Activity 28.performResume();//呼叫onResume mInstrumentation.callActivityOnResume(this);---activity.onResume();

在Activity中呼叫startActivity();
一、Activity
    1.startActivity()
    Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity( this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options);
二、Instrumentation
    2.execStartActivity();
    int result = ActivityManagerNative.getDefault().startActivity(whoThread, who.getBasePackageName(), intent, intent.resolveTypeIfNeeded(who.getContentResolver()), token, target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
ActivityManagerProxy.startActivity();
BinderProxy.transact(); //Binder驅動將處理邏輯從Activity所在程序切換到ActivityManagerService所在程序
三、ActivityManagerService
    3.startActivity();
startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profilerInfo, options, UserHandle.getCallingUserId());
mStackSupervisor.startActivityMayWait(caller, -1, callingPackage, intent, resolvedType, null, null, resultTo, resultWho, requestCode, startFlags, profilerInfo, null, null, options, false, userId, null, null);
四、ActivityStackSupervisor
    4.startActivityMayWait();
    int res = startActivityLocked(caller, intent, resolvedType, aInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options, ignoreTargetSecurity, componentSpecified, null, container, inTask);
        int err = startActivityUncheckedLocked(r, sourceRecord, voiceSession, voiceInteractor, startFlags, true, options, inTask);
targetStack.resumeTopActivityLocked(null, options);//啟動新的Activity之前,棧頂的Activity需要先onPause
targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);//啟動Activity
五、ActivityStack
    5.resumeTopActivityLocked();
result = resumeTopActivityInnerLocked(prev, options);
6.resumeTopActivityInnerLocked();
// We need to start pausing the current activity so the top one can be resumed...
    // 我們需要暫停當前的活動,這樣可以恢復最新的活動。
boolean dontWaitForPause = (next.info.flags& ActivityInfo.FLAG_RESUME_WHILE_PAUSING) != 0;
    boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, true, dontWaitForPause);//暫停所有的Activity
if (mResumedActivity != null) {
        ...
        pausing |= startPausingLocked(userLeaving, false, true, dontWaitForPause);//暫停當前的Activity
}

    5.startActivityLocked();//啟動Activity
task.addActivityToTop(r);//將Activity新增至棧頂
task.setFrontOfTask();//設定Activity為棧內前天
ensureActivitiesVisibleLocked(null, 0);//確保Activity使用者可見,啟動Activity
6.ensureActivitiesVisibleLocked(null, 0);//啟動Activity
mStackSupervisor.startSpecificActivityLocked(r, noStackActivityResumed, false);
六、ActivityStackSupervisor
    7.startSpecificActivityLocked();
realStartActivityLocked(r, app, andResume, checkConfig);
app.thread.scheduleLaunchActivity();//接下來同“從Launch程序啟動Application及Activity---七-16 加***處”

智商有限,理解有誤,還請指點!