- 點擊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