从Linux内核系统到init进程的分裂,以及后面会启动一个叫Zygote的进程开始,而Zygote会分裂出系统的核心服务进程SystemServer,也就是SystemServer里面包括了底层的ActivityManagerService、PackageManagerService、WindowManagerService等,这些核心服务都是通过Zygote.init启动的,ActivityManagerService就是我们后面通过binder的ipc通信机制来与客户端ActivityThread建立通信的。
当我们点击了应用之后,系统的Launcher应用会通过startActivity的方式启动应用,而Intent的获取会经过如下几部:
(1)ActivityManagerService会通过PackageManager的resolveIntent()收集这个intent对象的指向信息。
(2)指向信息被存储在一个intent对象中。
(3)下面重要的一步是通过grantUriPermissionLocked()方法来验证用户是否有足够的权限去调用该intent对象指向的Activity。
(4)如果有权限, ActivityManagerService会检查并在新的task中启动目标activity.
(5)现在, 是时候检查这个进程的ProcessRecord是否存在了。
所以如果ProcessRecord不是null,ActivityManagerService会创建新的进程来实例化该activity。ActivityManagerService调用startProcessLocked()方法来创建新的进程, 该方法会通过前面讲到的socket通道传递参数给Zygote进程.Zygote孵化自身, 并调用ZygoteInit.main()方法来实例化ActivityThread对象并最终返回新进程的pid。
随后就是我们熟悉的ActivityThread.main方法通过Looper.prepare和Looper.loop方法开启消息循环
紧接着就是创建Application对象的过程,先是创建好ContextImpl对象,然后通过makeApplication方法将app进程与Application建立联系,这里的Application创建交给了Instrumentation的对象,其实后面activity的创建,生命周期的回调都是通过它来触发的。
创建完Application后,紧接着就是我们熟悉的Activity,activity的创建同样交给了Instrumentation对象,上面说过ActivityManagerService会将携带的Intent对象交给了Lanucher应用,Lanucher的startActivity经过一系列的操作,最终会走Instrumentation的execStartActivity方法,该方法里面会去请求ActivityManagerService服务,最终通过binder通信将信息传给了客户端的ApplicationThread,最终会触发ApplicationThread的scheduleLaunchActivity方法,该方法将消息发送给了ActivityThread的handler对象,最终交给了Instrumentation对象创建activity。后面也就触发一系列的生命周期方法。