Activity,View,Window关系

2022-12-03  本文已影响0人  在岁月中远行

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来完成的。

上一篇下一篇

猜你喜欢

热点阅读