Activity,View,Window关系
1 为什么要设计Activity,View,Window?
用一句话来联系他们之间的关系:
Activity就像工匠(控制者),Window(承载模型)就像是窗户,View(视图)就像是窗花,LayoutInflater像剪刀,Xml配置就像窗花图纸。
就是工匠根据窗花图纸用剪刀剪出窗花来然后把它贴到窗户上。
Android根据他们不同的职能让他们各司其职,相互配合展示给我们灵活,精致的界面。
接下来开始一步一步地分析,首先从我们的Activity开始:
一个应用程序里所有的界面展示都是来自于Activity,那Activity是如何工作的呢?
android.app.ActivityThread#performLaunchActivity 这是启动Activity的核心类。
大致分为以下几个步骤:
1 创建ContextImpl 通过这个方法createBaseContextForActivity(r);
2 通过反射创建Activity实例: activity = mInstrumentation.newActivity()
3 activity.attach进行初始化window,设置回调等等。
window如何跟Activity关联?
每一个Activity都包含了唯一一个PhoneWindow,这个就是Activity的根Window吧,之所以说根Window,因为我们还可以在上面增加其他的Window,例如:弹出框(dialog,popwindow,toast等等)。
其实就是上述的 activity.attach方法。PhoneWindow是window的唯一实例。
它持有DecorView的引用,旧版本是DecorView个在PhoneWindow的内部类。
DecorView它不仅包含了我们自己的布局,它还包含了titleBar,为了在结构上更好地管理布局。
View和Window关系:Window是View的直接管理者。
而我们的是WindowManager接口也是继承 ViewManager的。
在Activity的生命周期中,我们知道要等到onResume时Activity的内容才可见。原因就是在onResume中。才真正去将PhoneWindow中的DecorView绘制到屏幕上去。onResume是在ActivityThread的handleResumeActivity()方法开始执行的。
1 创建decor View decor = r.window.getDecorView();
2 将DecorView交给WindowManagerImpl中进行添加View操作。wm.addView(decor, l);
将添加DecorView的操作交给了WindowManager的实现类WindowMagerImpl去进行处理,
WindowMagerImpl自己也并没有转而交给了单例WindowManagerGlobal进行处理,这是典型的桥接模式。在addView方法中,出现了一个很重要的类。ViewRootImpl,这里又调用了ViewRootImpl的setView()它是WindowManager和DecorView的桥梁。View的三大流程(测量,布局,绘制)都是通过ViewRootImpl来完成的。