Activity的啟動主要涉及四個進程
SystemServer進程:主要負責管理整個Framework
App進程:app用戶點擊桌面icon時,通過Launcher進程請求SystemServer進程,再通知Zygote孵化的。
Zygote進程:所有的應用進程都是有Zygote孵化出來的,而Zygote進程由init進程孵化出來,init進程的子進程。
Launcher 進程 :Zygote進程孵化的第一個應用進程。
Activity的啟動主要涉及到七個階段
第一階段: Launcher通知AMS要啟動新的Activity(在Launcher所在的進程執行)
第二階段:AMS先校驗一下Activity的正確性,如果正確的話,會暫存一下Activity的信息。然后,AMS會通知Launcher程序pause Activity(在AMS所在進程執行)
第三階段: pause Launcher的Activity,并通知AMS已經paused(在Launcher所在進程執行)
第四階段:檢查activity所在進程是否存在,如果存在,就直接通知這個進程,在該進程中啟動Activity;不存在的話,會調用Process.start創建一個新進程(執行在AMS進程,內部通過socket和Zygote通信,fork一個新進程)
第五階段: 創建ActivityThread實例,執行一些初始化操作,之后進入Loop循環。(執行在新創建的app進程)
第六階段:處理新的應用進程發出的創建進程完成的通信請求,并通知新應用程序綁定Application。如果Application不存在,會調用LoadedApk.makeApplication創建一個新的Application對象。并且通知進程啟動目標Activity組件(執行在AMS進程)
第七階段: 加載MainActivity類,調用onCreate聲明周期方法(執行在新啟動的app進程)
最后我們來簡單總結一下Activity的啟動流程。
1、startActivity
2、Instrumentation請求AMS啟動Activity(Binder)
3、AMS請求Zygote開啟進程
4、Zygote創建應用進程
5、應用進程啟動ActivityThread(主線程)
6、ActivityThread綁定Application
8、ActivityThread啟動Activity
9、調用Activity的onCreate方法