本次阅读为源码4.3,对比6.0代码,流程基本不变
1.startAcitvity -> startActivityForResult ->
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. finish
想要返回结果需要在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
转载于:https://my.oschina.net/u/3336230/blog/1522704