从源码的角度描述下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

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

你可能感兴趣的:(源码知识点)