【白话】App从启动到页面显示出来发生了什么
16lz
2021-01-26
- 点击App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求
- system_server收到请求后,向Zygote进程发送创建进程的请求
- Zygote进程fork出新的子进程,即App进程
- App进程创建出来后,通过Binder IPC向system_server发起attachApplication请求
- system_server收到请求后,进行一系列的准备工作,再通过bind IPC向App进程发送scheduleLaunchActivity请求
- App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息
- 主线程收到message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法
- App开始正式启动,正式进入Activity生命周期,执行完一系列的生命周期方法,UI渲染,然后就可以看到主界面了
【通俗的讲】
- 当你点击App图标的时候,你就要告诉系统,“嗨,伙计,我要启动这个哥们了”,我们知道进程间通信大多数是用的Binder机制,就相当于你告诉服务器,我要发起一个请求了啊
- 这个服务小弟(系统服务)收到消息后,“那我得去向老大说一下这边想创建个进程出来”,即向孵化器发送请求
- 老大(孵化器)听到后,“可以啊,来吧,我给你创建出来,记着到时候去咱们的系统里面做个备案记录下”
- 创建出来后,App创建出来后,要去服务小弟那里根据自己的情况,根据自己的情况去工商局办理营业执照(这就是平时我们应用中做一些先做的东西需要在Application中的原因)
- 服务小弟(系统服务)去做好记录后,就去叫这个进程起床干活了
- App被叫醒后,先送个指令,我得先去洗个脸画个妆
- 大脑收到指令后,就走过去那些瓶瓶罐罐的
- 然后开始化妆,弄完后出门,就让人看到了
Zygote
“受精卵”,更倾向于叫孵化器,是由linux的init进程fork出来的,而为了实现资源共享和更快的启动速度,之后所有的进程全都又第一个zygote fork出来
system_server
也是一个进程,所以也是由zygote进程fork出来的,这个从名字也可以看出来是系统级的服务,系统里面的一些重要服务都是在这个进程开启的,像AMS,PMS,WMS
ActivityManagerService
简称AMS,服务端对象,负责系统中所有Activity的生命周期,ams进行初始化的时机非常明确,就是SystemServer进行开启的时候初始化
Launcher
本质上也是一个应用程序,跟普通的App一样,也是继承Activity
更多相关文章
- Android(安卓)自定义 dialog
- Android中的签名
- 请求网络数据后更新视图
- Android(安卓)Binder 驱动 - 内核驱动层源码分析
- 查看Android设备给每个应用分配的内存大小
- Android(安卓)应用退出后销毁apk进程
- java.io.IOException: Cleartext HTTP traffic to xxx.xxx.xxx.x
- android中的dialog
- Android(安卓)Gems — AMS的Service生命周期管理