startActivity,finishActivity,onActivityResult源碼解讀

本次閱讀爲源碼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內部同時生成一個token
startActivityUncheckedLocked->
startActivityLocked->
resumeTopActivityLocked->
startSpecificActivityLocked->
realStartActivityLocked->
app.thread.scheduleLaunchActivity->
// ActivityThread.attach() -> AMS.attachApplicationLocked() ->
// ActivityStackSupervisor.attachApplicationLocked(ApplicationThread)
//回到應用進程,app.thread的實現是ApplicationThread,發送消息//LAUNCH_ACTIVITY
handleLaunchActivity-> 
performLaunchActivity //這裏根據ComponentName、ClassLoader和mInstrumentation.newActivity生成新的
                       //Activity

2. finishorm

想要返回結果須要在finish以前調用setResult對象

finish-> //一樣到AMS
finishActivity->
requestFinishActivityLocked-> //ActvityStack
finishActivityLocked-> 
finishActivityResultsLocked //這裏是把要返回的result數據回傳給ActivityRecord
                           //的resultTo,(既前一個ActivityRecord的results)。簡單來說這一步就是完成result
                           //向上傳給前一個ActivityRecord,並置空當前ActivityRecord的resultTo,防止持有
                           //多餘引用而沒法消除對象
finishCurrentActivityLocked-> //若是TOP Activity已經處於中止狀態直接finish,不然按生命週期執行直到finish
resumeTopActivityLocked -> //繼續生命週期,改變一些Activity狀態,pause、stop
next.app.thread.scheduleSendResult(next.appToken, a) ->
scheduleSendResult-> handleSendResult -> deliverResults ->
r.activity.dispatchActivityResult -> onActivityResult //分發結果給最終的Activity
相關文章
相關標籤/搜索