activity 启动模式_Activity启动流程分析(一)

activity启动流程整体如图所示

整个过程涉及到的主要类名已经在图中标红显示了,中间还有一些没标红但同样很重要的类,这些类咱们都会通过代码逐一分析其在Activity启动中的作用。

v2-540d3465adfd7eee2efd313eb0fa33dc_b.jpg

启动activity后实际上是Instrumentation对象(顺便提一句,咱们重写Activity生命周期的回调方法就是通过这个对象来调用的)来执行execStartActivity操作,如下图所示:

v2-6419bcc84d64a68ee949e987f2665b18_b.jpg

那么这个Instrumentation对象是怎么来的呢?看源码:

v2-ca0d36c06d77502c78984bcd4b193529_b.jpg

上面代码中的data.instrumentationName其实就是ComponentName,怎么样,是不是很熟悉,每次你在启动跳转Activity的时候传给Intent的参数里面就有这个。

接着往下走,Instrumentation对象调用了execStartActivity,在这个函数中,其实instrument对象是通过ActivityTaskManager类获取了IActivityTaskManager对象(具体实现类是ActivityTaskManagerService)并调用了它的startActivity方法,该方法中传递的参数whoThread其实就是一个IApplicationThread对象,** IApplicationThread whoThread = (IApplicationThread) contextThread; ** ,它的实现类是ApplicationThreadProxy,其实就是AIDL编译相关生成的,这里会涉及到IBinder进程间通信。因为ActivityTaskManagerService本质是一个运行在系统进程上的Service。

v2-a76b420ca9ee2aba7a62401199b0391b_b.jpg

v2-84fce3fcf34f8115fd556e73421c2f37_b.jpg

接着走,在ActivityTaskManagerService的startActivity方法中是直接调用并返回这个startActivityAsUser函数,进入这个函数,可以看到先是检查了一下userId(包括你的包名注册信息、启动模式等),这个id其实就是你的ApplicationId,根据这个来区分管理不同的app的activity相关请求。可以看到,真正的调用其实是在 ...execute() 这个函数中,getActivityStartController这个函数返回的是一个ActivityStartController对象,在这个对象中维护了两个重要的对象:

private final ActivityTaskManagerService mService;
 private final ActivityStackSupervisor mSupervisor;

当然还要其他的比如ActivityRecord对象(记录activity)以及一些启动列表。本文重点是上面两个对象,第一个其实之前已经介绍了,重点看下第二个,第二个其实在第一张图的最右边可以看到,ActivityStackSupervisor对象的相关内容放到后面再说。直接进入excute函数看看都做了些什么。

v2-5fdcc526ed1fade26c1279bc7d9e6844_b.jpg
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值