APP的啓動過程(附圖)

  1. 點擊桌面APP圖標時,Launcher的startActivity()方法,通過Binder通信,調用system_server進程中AMS服務的startActivity方法,發起啓動請求
  2. system_server進程接收到請求後,向Zygote進程發送創建進程的請求
  3. Zygote進程fork出App進程,並執行ActivityThread的main方法,創建ActivityThread線程,初始化MainLooper,主線程Handler,同時初始化ApplicationThread用於和AMS通信交互
  4. App進程,通過Binder向sytem_server進程發起attachApplication請求,這裏實際上就是APP進程通過Binder調用sytem_server進程中AMS的attachApplication方法,AMS的attachApplication方法的作用是將ApplicationThread對象與AMS綁定
  5. system_server進程在收到attachApplication的請求,進行一些準備工作後,再通過binder IPC向App進程發送handleBindApplication請求(初始化Application並調用onCreate方法)和scheduleLaunchActivity請求(創建啓動Activity)
  6. App進程的binder線程(ApplicationThread)在收到請求後,通過handler向主線程發送BIND_APPLICATION和LAUNCH_ACTIVITY消息,這裏注意的是AMS和主線程並不直接通信,而是AMS和主線程的內部類ApplicationThread通過Binder通信,ApplicationThread再和主線程通過Handler消息交互。 ( 這裏猜測這樣的設計意圖可能是爲了統一管理主線程與AMS的通信,並且不向AMS暴露主線程中的其他公開方法,大神可以來解析下)
  7. 主線程在收到Message後,創建Application並調用onCreate方法,再通過反射機制創建目標Activity,並回調Activity.onCreate()等方法

到此,App便正式啓動,開始進入Activity生命週期,執行完onCreate/onStart/onResume方法,UI渲染後顯示APP主界面。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章