小王今天再次看了《Android进阶解密》的根Activity这一章节。发现上次看过的内容又已经忘记的差不多了。总结了看书存在的问题,有些知识点不方便使用代码进行训练。如果自己不进行总结十分容易再次忘记。就像没看过一样。于是小王总结了下面的学习笔记。
具体的启动流程可以自行在网上搜索。
在书中根Activity启动这一小节中作者将启动过程分为三个部分
-
Luncher请求ActivityManagerService过程
-
ActivityManagerService到ApplicationThread的调用过程
-
ActivityThread启动Activity的过程
在这几个过程中我们需要关注的点在于:
-
Luncher启动应用程序的的流程除了启动参数不同,其它的位置和我们正常启动一个Activity的流程相同,最终都会通过Activity#startActivityForResult()调用Instrumentation#execStartActivity方法借助binder跨进程请求ActivityManagerServer启动Activity。
-
代码在进入到ActivityManagerServeice后,由于根Activity的创建时,应用的进程没有创建,在ActivityStackSupervisor#startSpecificActivityLocked方法中不会执行到启动activity的逻辑。而是调用ActivityManagerService#startProcessLocked先创建相对应的进程。
-
进程创建好之后会进入到ActivityThread#main方法。调用ActivityThread#attach最后再次回到ActivityManagerService。在ActivityManagerService#attachApplication中经过层层调用最后借助ActivityThread#ApplicationThread来启动activity
-
整个过程有4个进程参与:分别是 Launcher,SystemServer,Zygote,应用程序。其中ActivityManagerService存在于SystemServer,Zygote用于创建应用程序进程。
-
Instrumentation 对象需要我们稍微注意一下,它的只要职责是用来监控应用程序和系统的交互。
笔记参考:《Android进阶解密 》 根activity的启动过程