从源码的角度描述下Activity的启动过程

Activity启动流程图

  当我们点击 app 后,Launcher 进程采用 Binder IPC 向 system_server 进程发起
startActivity 请求,system_server 进程接收到请求后,向 zygote 进程发送创建进程的请求, Zygote 进程 fork 出新的子进程,即 App 进程,然后启动我们 App 的第一个类 ActivityThread,其实说到底我们的 app 就是一个 main 函数,也就是启动了 ActivityThread.main()。
  主函数中,创建 looper 对象进行消息循环,实例化一个 activityThread 对象,调 用它的 attach 方法,获取 AMS 调用它的 attachApplication 方法,AMS 通 过 ApplicationThread 与 ActivityThread 进行跨线程通信,接着通过 handler 调用了 handleBindApplication(),其主要作用是绑定我的的自定义的 application,通过反射创 建 mInstrumentation 进行一系列初始化操作。
  mInstrumentation 调用 newApplication,同样通过反射出一个 application 并且调 用其 attach(),也就是说我们自定义 application 的 attach 就是在这里调用的。接着mInstrumentation 再调用 callApplicationOnCreate 方法,application 的 oncreate 方 法此时调用。
  bindApplication 之后,调用 startActivity,ApplicationThread 调用 schedule LaunchActivity 方法,通过 handler 与 ActivityThread 通信,ActivityThread 通过 mInstrumentation 的 newActivity 反射实例化位于 ActivityTask 的栈顶的 Activity, mInstrumentation 又通过 callActivityOnCreate 使 Activity 调用 onCreate 方法,接着 mInstrumentation 再调用 callActivityOnResume 方法使 Activity 调用 onResume 方法。
接下来就是上源码了,源码版本8.1.0。

源码部分


LauncherActivity.java

LauncherActivity在此发起 startActivity 请求。

Activity.java

startActivity方法最终会调用startActivityForResult方法。

Activity.java

可以看出startActivityForResult主要调用是mInstrumentation.execStartActivity方法。那mInstrumentation.execStartActivity什么时候赋值的呢?

Activity.java

在Activity的attach方法中mInstrumentation被instr参数赋值。那我们查看attch方法什么时候被赋值。


这个时候我们转到ActivityThread类中;

ActivityManager.java

对于一个app进程来说,起真正的入口在ActivityThread类中。当
Zygote进程孵化出新的app进程后,会执行ActivityThread的main方法。main方法中会准备Looper和消息队列,然后调用attach方法绑定AMS,Looper会不断循环,读取消息并分发消息,没有消息时会阻塞队列。

ActivityManager.java


ActivityManager.java

由这两个图可以看出mgr就是AMS,调用attachApplication方法。

ActivityManagerService.java

接着继续查看attachApplicationLocked方法。

ActivityManagerService.java

bindApplication的参数很多,将ApplicationThread对象绑定到AMS中,ApplicationThread是ActivityThread的内部类。接着我们看看mStackSupervisor.attachApplicationLocked(app)。mStackSupervisor指向的是一个ActivityStackSupervisor对象。

ActivityStackSupervisor.java

我的理解是ActivityStackSupervisor是用来管来app进程中的Activity栈的。我们再来看看realStartActivityLocked方法。

ActivityStackSupervisor.java

realStartActivityLocked方法中会查找对应的Activity,并且检查配置一些信息,比如打开的Activity是什么启动模式,是否可见,是否处于同一个进程等等。所有参数信息到位后调用scheduleLaunchActivity方法。

ActivityThread.java(ApplicationThread是ActivityThread的内部类)

之前说过AMS绑定了ApplicationThread,所以AMS可以调用ApplicationThread的scheduleLaunchActivity。H是继承了ActivityThread中的Handler,对用的Looper便是一开始ActivityThread中Looper,发送标志位LAUNCH_ACTIVITY。

ActivityThread.java

对应H调用handleLaunchActivity方法。handleLaunchActivity方法调用performLaunchActivity方法。

ActivityThread.java

到了这里,我们终于填上了之前的坑。mInstrumentation的callActivityOnCreate最终会调用Activity的onCreate方法。

Instrumentation.java

到这里我们的源码分析就结束了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值