前面的两篇文章Android进阶系列5—从LayoutInflater到setContentView的setContentView,Android进阶系列4—从LayoutInflater到setContentView的LayoutInflater讲述了从setContentView开始如何将布局文件添加到DecorView中,再如何利用LayoutInflater将xml文件解析成View树。在Android进阶系列0—View的工作流程:measure,layout,draw小结中,描述了View的绘制三步骤,其中提到:
View由ViewRoot完成三大流程。在ActivityThread中,当Activity对象被创建完毕后,DecorView会被添加到Window中,同时创建ViewRootImpl的对象,将其和DecorView关联。View的绘制流程由ViewRoot的performTraversals()方法调用performMeasure,performLayout,performDraw完成顶级View(即DecorView)的measure,layout,draw。
这段话当时直接摘抄自《Android开发艺术探索》,博主那时候对DecorView,ViewRoot等概念也不明白。但是有了这三篇文章做基础之后,博主觉得需要对View绘制到屏幕的流程探探究竟了。
很感谢从ViewRootImpl类分析View绘制的流程这篇文章,讲解了博主想学习的知识,啊哈哈!
By the way,为啥sdk source中的有些文件Google要隐藏呢?不能直接在AS中查看,有点不方便。
当Activity初始化 Window和将布局添加到PhoneWindow的内部类DecorView类之后,ActivityThread类会调用handleResumeActivity方法将顶层视图DecorView添加到PhoneWindow窗口(聪明的读者可以猜到,后面这又是一篇文章)。
handleResumeActivty()
ActivityThread类的handleResumeActivity方法如下所示:
final void handleResumeActivity(IBinder token,
boolean clearHide, boolean isForward, boolean reallyResume) {
......
if (r.window == null && !a.mFinished && willBeVisible) {
//获得当前Activity的PhoneWindow对象
r.window = r.activity.getWindow();
//获得当前phoneWindow内部类DecorView对象
View decor = r.window.getDecorView();
//设置DecorView不可见
decor.setVisibility(View.INVISIBLE);
//获取WindowManagerImpl对象,WindowManager继承自ViewManager,WindowManagerImpl是WindowManager的实现类
ViewManager wm = a.getWindowManager();
WindowManager.LayoutParams</