1.activity,window,view,viewroot之间的关系
acitvity包含一个phonewindow, phonewindow里面持有一个view的根视图decorview,viewroot既不属于view,也不属于viewgroup,他主要负责跨进程通信。
2.view的生成
acitivtythread的handleLaunchActivity方法里面会调用attach方法,生成一个phonewindow,接着调用setContentview方法生成decorview。一个activity对应一个window和decorview。这时本地的window和decorview已经生成了。然后在handleResumeActivity()方法里,调用addView方法,最终会通过ViewRootImpl里面的mWindowSession.addtodisplay()方法,进行跨进程通信,到WMS里注册。之后会走到performTraversals()方法,进行绘制。具体的绘制流程就是performmeasure进行测量,performlayout进行布局,performdraw进行绘制。
3.理解MeasureSpec
MeasureSpec表示的是一个32位的整形值,它的高2位表示测量模式SpecMode,低30位表示某种测量模式下的规格大小SpecSize。MeasureSpec是View类的一个静态内部类,用来说明应该如何测量这个View。
4.为什么view.post()能保证获取到view的宽高?
因为view.post()方法里有attachInfo的判断,当他为空的时候,会加入到主线程的消息队列中。View.post() 添加的任务的执行是在View绘制任务后才执行,即在View绘制流程结束之后执行。