Activity,Window和View之间的关系
2016-07-08 15:43
351 查看
Activity是Android应用程序的载体,允许用户在其上创建一个用户界面,提供用户处理事件的API,并维护应用程序的生命周期。
Activity的内部实际上持有了一个Window的子类PhoneWindow。Activity中关于界面的绘制实际上是交给PhoneWindow中的setContentView方法来实现。
Activity在onCreate之前调用attach方法,在attach方法中会创建window对象。window对象创建时并没有创建Decor对象对象。用户在Activity中调用setContentView,然后调用window的setContentView,这时会检查DecorView是否存在,如果不存在则创建DecorView对象,然后把用户自己的View
添加到DecorView中。Activity被创建后,系统会调用它的attach方法来将Activity添加到ActivityThread当中,在attach方法中创建了一个window对象。
在ActivityThread当中调用windowmanager.addView(decor,
l) 把它加入到window manager proxy的mViews中,同时为这个decor view创建一个ViewRoot,ViewRoot负责协调decorview与windowmanager直接绘图、事件处理。说简单点就是 DecorView是客户端所有view的根,window manager proxy为这个decorview创建一个ViewRoot和Window manager service打交道
下面分析View的创建:Window聚合了DocerView,当用户调用setContentView的时候会把一颗View树仍给DocerView.View树是已经创建好的实例对象了,所以我们研究的是DocerView是个什么东西,它是如何被创建的。首先创建一个DecorView,DecorView是一个扩张FrameLayout的类,是所有窗口的根View。我们在Activity中调用的setConctentView就是放到DecorView中了。我们可以看出Activity中关于界
面的绘制实际上全是交给Window对象来做的。这是我们类图的聚合关系如下:Activity--->Window--->DecorView
Activity的内部实际上持有了一个Window的子类PhoneWindow。Activity中关于界面的绘制实际上是交给PhoneWindow中的setContentView方法来实现。
Activity在onCreate之前调用attach方法,在attach方法中会创建window对象。window对象创建时并没有创建Decor对象对象。用户在Activity中调用setContentView,然后调用window的setContentView,这时会检查DecorView是否存在,如果不存在则创建DecorView对象,然后把用户自己的View
添加到DecorView中。Activity被创建后,系统会调用它的attach方法来将Activity添加到ActivityThread当中,在attach方法中创建了一个window对象。
在ActivityThread当中调用windowmanager.addView(decor,
l) 把它加入到window manager proxy的mViews中,同时为这个decor view创建一个ViewRoot,ViewRoot负责协调decorview与windowmanager直接绘图、事件处理。说简单点就是 DecorView是客户端所有view的根,window manager proxy为这个decorview创建一个ViewRoot和Window manager service打交道
下面分析View的创建:Window聚合了DocerView,当用户调用setContentView的时候会把一颗View树仍给DocerView.View树是已经创建好的实例对象了,所以我们研究的是DocerView是个什么东西,它是如何被创建的。首先创建一个DecorView,DecorView是一个扩张FrameLayout的类,是所有窗口的根View。我们在Activity中调用的setConctentView就是放到DecorView中了。我们可以看出Activity中关于界
面的绘制实际上全是交给Window对象来做的。这是我们类图的聚合关系如下:Activity--->Window--->DecorView
相关文章推荐
- iOS学习(十五)Objective-C 方法的覆盖
- iOS - 报错 linker command failed with exit code 1
- node.js开发工具--visual studio code
- java 空指针
- 使用Python读写及压缩和解压缩文件的示例
- 如何判断程序集是Managed Assembly
- Java环境搭建(JDK+MyEclipse+Maven+Resin)
- String
- 自定义注解
- 11.http 客户端
- Ubuntu/Linux 下部署Ant攻略
- 矩形填补
- Linux服务器宕机案例第二则
- MySQL使用hugepage
- JS中变量名作为if条件的 true/flase
- FIFO 和 LRU 调度算法
- 字符串拼接 针对in条件
- 台湾电子产业转型面临考验
- Oracle Sales Cloud简单介绍
- Ubuntu update: Failed to fetch, Hash sum mismatch