美文网首页
Activity,View,Window关系

Activity,View,Window关系

作者: 在岁月中远行 | 来源:发表于2022-12-03 20:55 被阅读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来完成的。

    相关文章

      网友评论

          本文标题:Activity,View,Window关系

          本文链接:https://www.haomeiwen.com/subject/yjfmfdtx.html