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佈局
啓動過程
- 不管是經過從桌面上點擊仍是經過 startActivity 都會調用到 startActivitForResult 方法,而後會調用 Instrumentation 的方法, Instrumentation 是應用和系統服務的一個橋樑),Instrumentation 的方法會經過 Binder 方式調用 ActivityManagerService 的 startActivity 方法。同時會把 ApplicationThread 這個 Binder 傳入給 ActivityManangerService 。這樣 ActivityManangerService 就能夠經過 ApplicaitonThread 與 ActivityThread 進行通信了。
- ActivityManagerService 收到了 startActivity ,會向 zygote 進程發送建立進程的請求
- Zygote 建立子進程成功,即 app 進程
- 而後通過一系列的準備,會經過 Binder 方式調用 ApplicationThread , 經過 Handler 調用 ActivityThread 的 handleLaunchActivity 。在 handleLaunchActivity 中調用 performLaunchActivity 這個方法,在這個方法中會經過 Instumention 使用 classloader 建立 Activity 對象,而後初始化 application ,ContextImpl ,設置主題,調用 attatch 方法,而後經過調用 Instrumentation 來調用 activity 的生命週期方法 onCreate()。 在 ActivityThread 的 handleLaunchActivity 的方法中,在調用 performLaunchActivity之後 會繼續調用 handleResumeActivity 方法,該方法會經過 Instrumentation 調用 activity 的生命週期方法 onResume().
顯示過程
- 在啓動過程當中,經過 ActivityThread 的 handlerLauncherActivity 方法,會調用到 activity 的生命週期方法 onCreate()。在 onCreate() 中調用 setContentView() 方法,設置佈局文件,該方法會調用 getWindow.setContentView() 方法, getWindow() 拿到的是 window 對象,Window 的實現類是 PhoneWindow ,因此調用的是 PhoneWindow 的 setContentView() 方法,在 PhoneWindow 的 setContentView() 中會調用 installDecorView() 方法來建立 DecorView ,而後經過 layoutinflate 的 inflate 方法把佈局文件加載到 DecorView 的 ContentView 中,雖然已經把佈局添加到了 Decorview ,可是尚未顯示出來。
- 在啓動過程當中,handlerLauncherActivity() 方法中,在調用 performLauncherActivity 方法之後,會調用 handleResumeActivity 方法,該方法會調用 activity 的 makeVisible() 方法,使 DecorView 經過 WindowManager 加載到屏幕上顯示。那佈局怎麼繪製出來的呢,看下面。
繪製過程
- 在 調用 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 調用的。