Activity-Window-View三者的关系

首先分别介绍下这三者:

  • Activity是安卓四大组件之一,负责界面展示、用户交互与业务逻辑处理;
  • Window就是负责界面展示以及交互的职能部门,就相当于Activity的下属,Activity的生命周期方法负责业务的处理;
  • View就是放在Window容器的元素,Window是View的载体,View是Window的具体展示。

然后一句话介绍下三者的关系:

    Activity通过Window来实现视图元素的展示,window可以理解为一个容器,盛放着一个个的view,用来执行具体的展示工作。

                                                        

当我们运行程序的时候:

  1. 在Activity中调用attach,创建了一个Window
  2. 创建的window是其子类PhoneWindow,在attach中创建PhoneWindow
  3. 在Activity中调用setContentView(R.layout.xxx)
  4. 其中实际上是调用的getWindow().setContentView()
  5. 调用PhoneWindow中的setContentView方法
  6. 创建ParentView:
作为ViewGroup的子类,实际是创建的DecorView(作为FramLayout的子类)
  7. 将指定的R.layout.xxx进行填充
通过布局填充器进行填充【其中的parent指的就是DecorView】
  8. 调用到ViewGroup
  9. 调用ViewGroup的removeAllView(),先将所有的view移除掉
  10. 添加新的view:addView()

最后总结:

Window和View的关系

        window是一个界面的窗口(唯一的实现类是PhoneWindow),是存放view的容器,即Window是View的管理者,或者说是附着在Window上的。Android中所有的视图都是通过Window来呈现的,比如Activity,Dialog,Toast,他们的视图都是附着在Window上的。比如我们常用的弹出对话框时,把背景变暗,就是通过折这Window的alpha值来实现的。Window的添加、删除和更改是通过WindowManager来实现的。而WindowManager又是继承ViewManager的


ViewManager是一个接口有三个方法:


可见WindowManager也是一个接口,它的具体实现类是WindowManagerImpl




可见,他的addView,removeView和updateView都是通过WindowManagerGloabal实现的。WindowManagerGloabal内部最终是通过WindowManagerService来创建Window的。


Activity与Window的关系

        我们知道,Activity是向用户展示一个界面,并可以与用户进行交互。通过我们之前的分析,我们知道,Activity内部持有一个Window对象,用来管理View。由此可知,window就像是Activity的一个手下,为Activity管理View,就连事件的分发,也是Activity先发给Window,然后window再向下分发。我们看一下Activity的代码: 


事件传来之后,调用Window的superDispatchTouchEvent(ev)方法,由其实现类PhoneWindow做具体实现,看一下PhoneWindow中这个方法: 


他又调用mDecor的superDispatchTouchEvent(ev)方法。然后跟进去可以看到如下代码:


继续跟踪代码可以看到:


由于DecorView是继承自FrameLayout的,而FrameLayout又继承自ViewGroup,所以下面进入了ViewGroup的事件分发的流程。



注:一个Activity构造的时候只能初始化一个Window(PhoneWindow),另外这个PhoneWindow有一个”ViewRoot”,这个”ViewRoot”是一个View活ViewGroup,是最初始的跟视图,然后通过addView方法将View一个个层叠到ViewRoot上,这些层叠的View最终放在Window这个载体上面

参考链接:https://blog.csdn.net/A448955639/article/details/77430263

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐