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
相关文章
相关标签/搜索