Android 啓動、繪製、顯示過程

Activity 啓動過程:
startActivity()-> Instrumentation.execStartActivity()-> Binder->ActivityManagerService-> Zygote fork app -> Binder -> ApplicationThread.scheduleLaunchActivity() - > Handler -> ActivityThread.handleLaunchActivity() -> performLauncherActivity -> Instrumentation create Activity -> 設置 application ,建立 ContextImpl,調用 attatch 方法,調用 Instrumentation 的 callActivityOnCreate-> Activity.onCreate() -> setContentView() -> PhoneWindow.setContentView() -> DecorView . setContentView(); -> handleLaunchActivity()-> handleResumeActivity()-> Instrumentation.callActivityonResume()->Activity.onResume(); -> handleLaunchActivity() -> Activity.makeVisibile() ; -> Activity.makeVisibile()-> WindowManager.addView() - > WindowManagerImpl.addView()->WindowManagerGlobal.addView()-> ViewRootImpl.setView() -> requestLayout -> scheduleTranversals()->Runable->doTranversals()->performTranversales()->measure()->layout()->draw();app

涉及到進程間通信 Binder
涉及到線程間通信 Handler
涉及到 View 的繪製流程
關鍵類還有 Window, PhoneWindow ,WindowManager ,WindowManagerImpl, WindowManagerGlobal, ViewRootImpl, DecorView佈局

啓動過程

  1. 不管是經過從桌面上點擊仍是經過 startActivity 都會調用到 startActivitForResult 方法,而後會調用 Instrumentation 的方法, Instrumentation 是應用和系統服務的一個橋樑),Instrumentation 的方法會經過 Binder 方式調用 ActivityManagerService 的 startActivity 方法。同時會把 ApplicationThread 這個 Binder 傳入給 ActivityManangerService 。這樣 ActivityManangerService 就能夠經過 ApplicaitonThread 與 ActivityThread 進行通信了。
  2. ActivityManagerService 收到了 startActivity ,會向 zygote 進程發送建立進程的請求
  3. Zygote 建立子進程成功,即 app 進程
  4. 而後通過一系列的準備,會經過 Binder 方式調用 ApplicationThread , 經過 Handler 調用 ActivityThread 的 handleLaunchActivity 。在 handleLaunchActivity 中調用 performLaunchActivity 這個方法,在這個方法中會經過 Instumention 使用 classloader 建立 Activity 對象,而後初始化 application ,ContextImpl ,設置主題,調用 attatch 方法,而後經過調用 Instrumentation 來調用 activity 的生命週期方法 onCreate()。 在 ActivityThread 的 handleLaunchActivity 的方法中,在調用 performLaunchActivity之後 會繼續調用 handleResumeActivity 方法,該方法會經過 Instrumentation 調用 activity 的生命週期方法 onResume().

顯示過程

  1. 在啓動過程當中,經過 ActivityThread 的 handlerLauncherActivity 方法,會調用到 activity 的生命週期方法 onCreate()。在 onCreate() 中調用 setContentView() 方法,設置佈局文件,該方法會調用 getWindow.setContentView() 方法, getWindow() 拿到的是 window 對象,Window 的實現類是 PhoneWindow ,因此調用的是 PhoneWindow 的 setContentView() 方法,在 PhoneWindow 的 setContentView() 中會調用 installDecorView() 方法來建立 DecorView ,而後經過 layoutinflate 的 inflate 方法把佈局文件加載到 DecorView 的 ContentView 中,雖然已經把佈局添加到了 Decorview ,可是尚未顯示出來。
  2. 在啓動過程當中,handlerLauncherActivity() 方法中,在調用 performLauncherActivity 方法之後,會調用 handleResumeActivity 方法,該方法會調用 activity 的 makeVisible() 方法,使 DecorView 經過 WindowManager 加載到屏幕上顯示。那佈局怎麼繪製出來的呢,看下面。

繪製過程

  1. 在 調用 activity 的 makeVisible() 方法後,把 DecorView 經過 addView 方法添加到了 WindowManager 中,WindowManager 的實現類是 WindowManagerImpl ,WindowManagerImpl 的 addView 方法調用了 WindowManagerGlobal 的 addView 方法,在 WindowManagerGlobal 的 addView 方法中,初始化了 ViewRootImpl 類,並經過 setView 方法把 View 和參數注入,而後調用了 requestLayout 方法, requestLayout 會調用 scheduleTraversal 而後調用一系列方法之後,會調用 measure ,layout ,draw 方法,完成佈局的測量,佈局和繪畫。以上就完成了佈局的繪製,這時手機上就顯示出來了設置的佈局。 ViewGroup-------------------------------> View performMeasure -> measuer -> onMeasure -> measure performLayout -> layout -> onLayout -> layout performDraw -> draw -> onDraw -> draw

關鍵類:spa

  • Instrumentation: 應用程序與系統服務的橋樑。爲何是橋樑呢,首先是 startActivity ,會經過 Instrumentation 的 execStartActivity 方法調用 ActivityManagerService 的方法。而後在 acitivty 的生命週期方法的調用,都是由 Instrumentation 調用的。
相關文章
相關標籤/搜索