本文总结自慕课网风语老师的Framwork的课程.
相关问题
1.Activity的显示原理(Window/DecorView/ViewRoot)
2.Activity的UI刷新机制(Vsync/Choreographer)
3.UI绘制原理(Measure/Layout/Draw)
4.Surface原理(Surface/SurfaceFlinger)
1.关于Activity的显示原理的几个问题
setContentView()
为什么在onResume之后才显示
ViewRoot是干嘛的,是ViewTree的rootView么?
window是在attach方法中初始化的
回顾activity启动过程
其中attach上下文是一个广义的,其中就报告初始化Window对象,然后才触发onCreate回调
window的setContentView函数:
这个函数的作用是:
1.创建一个DecorView
2.将contentView传递的布局id添加到DecorView中
此时只是建立了一个ViewTree,还有显示视图
真正显示视图的地方在handlerResumeActivity
取出DecorView,添加到WindowManager
makeVisible()只是调用了一下重绘,真正重要的方法是wm.addView(),来启动View的绘制流程
ViewRootImpl负责管理ViewTree
重点看一下setView() 中的requestLayout() 和addToDisplay
首先看一下requsetLayout()
1.scheduleTraversals,向Choreographer中注册一个回调,这个回调会在下一个Vsync信号来的时候执行
2.mTraversalRunnable回调,调用了doTraversal()
3.doTraversal()调用performTraversals(),performTraversals()是真正执行绘制的方法
关于performTraversals()方法的四个重要的函数
首先看relayoutWindow(params,…), 这个函数是向WMS申请Surface
有了surface之后就有了buffer, 在buffer上绘制 , 绘制之后提交到surfaceFlinger,surfaceFlinger用于合成图像 , 写到屏幕的缓冲区 , 页面就能显示出来了 .( 只有第一次绘制的时候会申请Surface)
再看mWindowSession.addToDisplay
mWindowSession的由来是,WMS申请的Session对象,Session对象用来给应用和WMS进行通信的
addToDisplay(mWindow)方法,传递了window对象,方便WMS调用应用端的方法.
最重要的原因是方便WindowManager去管理各个层级的window.
回顾
总结面试怎么答 :
PhoneWindow是什么,怎么创建的
setContentView原理,DecorView是什么
ViewRoot是什么?有什么作用
View的显示原理是什么?WMS发挥了什么作用