帶著如下幾個問題去聽課
- ActivityThread起到的是什么作用?
- Activty的生命周期oncreate 和onResume 在ui繪制流程中做了哪些事情?
- View是如何添加到window上面?
- 為什么View的更新不能在子線程?
ActivityThread起到的是什么作用
ActivtityThread是activity里面的各個生命周期方法的執(zhí)行入口。里面都是通過Handler去實現(xiàn)的。
Activty的生命周期oncreate 和onResume 在ui繪制流程中做了哪些事情?
onCreate只是把View添加到window上面,并沒有開始測量,布局。測量和布局是在onresume執(zhí)行的。
具體的源碼可以從ActivityThread的performLaunchActivity。 這里面會通過調(diào)用WindowManager.addView(decorView, params),然后通過windowManager可以一層層的追溯到ViewRootImpl。 viewRootImpl通過調(diào)用setView方法后會執(zhí)行到requestlayout方法。 requestLayout方法在往后就通過編舞者,來調(diào)用performMeasure, performLayout, perormDraw,從而達到測量,布局,繪制的目的。
View是如何添加到window上面
Activity.setContentView ------> Window.setContentView(window是一個抽你類,只有唯一的一個實例PhoneWindow)
最后就調(diào)用到了PhoneWindow.setContentView
installDecorView(創(chuàng)建頂層view為FrameLayout子類DecorView) ------> 根據(jù)不同的主題加載相應(yīng)的布局添加到頂層View上面 ------> 由于每個布局上面必定有id為android.R.id.content控件,因此setContentView的布局最后是添加到了android.R.id.content的Frame上面的。
為什么View的更新不能在子線程?
那是因為在ViewRootImpl調(diào)用 setView方法后, 里面有一個checkThread方法, 判斷了當前線程是否為主線程。 如果不是主線程,則拋出異常。因為ui更新必須在主線程里面才能完成。