本次阅读为源码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