startActivity,finishActivity,onActivityResult源码解读

本次阅读为源码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内部同时生成一个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. finish

想要返回结果需要在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

转载于:https://my.oschina.net/u/3336230/blog/1522704

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值