本次閱讀爲源碼4.3,對比6.0代碼,流程基本不變app
1.startAcitvity -> startActivityForResult -> spa
mInstrumentation.execStartActivity->ActivityManagerNative.getDefault() //表明AMS,如下代碼運行在AMS進程 //AMS跨進程app經過ApplicationThreadNative .startActivity->startActivityAsUser->startActivityAsUser->startActivityMayWait-> //ActivityStack,這裏有一個重要的參數(resultTo),這個參數是一個Binder類型的,表明當前 //activity的token,在這裏能夠看做一個查找activity的KEY,經過它能夠找到對應的ActivityRecord //ActivityRecord裏邊的resultTo和startActivityForResult有關,是準備接收result的這個activity, //結構體是ActivityRecord。這裏首先要弄明白ActivityRecord,它裏邊又保持了一個 //ActivityRecord引用resultTo,因此ActivityRecord像一個鏈表同樣,每個都會記錄上一個startActivityLocked-> //生成新的ActivityRecord,ActivityRecord內部同時生成一個tokenstartActivityUncheckedLocked->startActivityLocked->resumeTopActivityLocked->startSpecificActivityLocked->realStartActivityLocked->app.thread.scheduleLaunchActivity->// ActivityThread.attach() -> AMS.attachApplicationLocked() -> // ActivityStackSupervisor.attachApplicationLocked(ApplicationThread) //回到應用進程,app.thread的實現是ApplicationThread,發送消息//LAUNCH_ACTIVITYhandleLaunchActivity->performLaunchActivity //這裏根據ComponentName、ClassLoader和mInstrumentation.newActivity生成新的 //Activity2. finishorm
想要返回結果須要在finish以前調用setResult對象
finish-> //一樣到AMSfinishActivity->requestFinishActivityLocked-> //ActvityStackfinishActivityLocked-> finishActivityResultsLocked //這裏是把要返回的result數據回傳給ActivityRecord //的resultTo,(既前一個ActivityRecord的results)。簡單來說這一步就是完成result //向上傳給前一個ActivityRecord,並置空當前ActivityRecord的resultTo,防止持有 //多餘引用而沒法消除對象finishCurrentActivityLocked-> //若是TOP Activity已經處於中止狀態直接finish,不然按生命週期執行直到finishresumeTopActivityLocked -> //繼續生命週期,改變一些Activity狀態,pause、stopnext.app.thread.scheduleSendResult(next.appToken, a) -> scheduleSendResult-> handleSendResult -> deliverResults -> r.activity.dispatchActivityResult -> onActivityResult //分發結果給最終的Activity