一、概述  

  Activity 可以说是应用程序的载体(也可以理解为界面的载体,但是不界面),用户能够在上面绘制界面(Activity本身不绘制界面),并提供用户处理事件的API,维护应用程序的生命周期(Android应用程序是由多个 Activity 堆积而成,而各个 Activity 又有其独立的生命周期)。

        Activity内部组合了一个Window(这是一个抽象类,具体是PhoneWindow)对象。我们自己写的扩展一个Activity时,在onCreate 方法中调用 setContentView,实际上是调用Window对象的 setContentView,所以说界面绘制全部是由Window类的实现类(PhoneWindow类)来完成的。
     
 
二、源码分析
  
 
  1.   跟踪源码进入到 Activity 中看到 setContentView的实现如下:
 
  public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
initActionBar();
}

看第二行代码,先得到一个 Window 对象。

 public Window getWindow() {
return mWindow;
}

getWindow 很简单只是返回一个 对象而已,那么,Window对象到底是在哪儿实例化的呢?

  我们可以看看,Activity 中的 attach 方法,这里面得到了一个 Window 对象

mWindow = PolicyManager.makeNewWindow(this);

  2.   由Activity中的 setContentView 方法可以看到,界面绘制并不是由 Activity 完成的,他是调用了 Window 类的 setContentView 来实现的。所以我们就去看看 Window 类的代码:

public abstract void setContentView(int layoutResID);

    我们可以看到, Window 类是一个抽象类,并且 setContentView  是一个抽象方法。所以说,其具体实现是由 实现 Window类的类来完成的(PhoneWindow)。

  3.   在文档中已经描述了:The only existing implementation of this abstract class is  android.policy.PhoneWindow.  我们要来看看这个类才能知道 界面是如何完成绘制的。

  @Override
public void addContentView(View view, ViewGroup.LayoutParams params) {
if (mContentParent == null) {
installDecor();
}
if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
// TODO Augment the scenes/transitions API to support this.
Log.v(TAG, "addContentView does not support content transitions");
}
mContentParent.addView(view, params);
final Callback cb = getCallback();
if (cb != null && !isDestroyed()) {
cb.onContentChanged();
}
}

  先判断mContentParent是否为空,如果为空就调用 installDecor 方法(自己可以看一下源码),  最后会添加 View。

    Window 中有一个 DecorView,可以理解为“ViewRoot”,引号是说其实这个“ViewRoot”是一个View或者说ViewGroup,是最初始的根视图。构建视图就是向这里面添加。所以到这里大概可以知道,installDecor 方法大概是 构建一个根视图。

三、总结

  Activity创建时系统会调用其 attach 方法,将其添加到ActivityThread当中,在attach方法中创建了一个window对象。

  我们知道Window组合了一个 DocerView, 当用户调用 setContentView 的时候会把一棵 View 树仍给DocerView。 View树是已经创建好的实例对象,所以我们要研究 DocerView是个什么东西,它是如何被创建的。

  我们回头看看Window实现里边的setContentView方法,代码中有一个 installDecor 方法,这个方法中有一个  generateDecor。 generateDecor直接new了一个DecorView对象

protected DecorView generateDecor() {
return new DecorView(getContext(), -1);
}

  当 DocerView 被创建后,就会调用  mContentParent.addView(view, params); 来将 view  添加到 DocerView当中。

最后总结一下:

  

  Activity在onCreate时调用attach方法,在attach方法中会创建window对象。window对象创建时并没有创建 DocerView 对象。用户在Activity中调用setContentView,然后调用window的setContentView,这时会检查DecorView是否存在,如果不存在则创建DecorView对象,然后把用户自己的 View  添加到 DecorView 中。

装模作样的声明一下:本博文章若非特殊注明皆为原创,若需转载请保留原文链接(http://www.cnblogs.com/kest/p/5141817.html)及作者信息k_est

Android 中的Activity、Window、View之间的关系的更多相关文章

  1. android中activity,window,view之间的关系

    activity:控制单元 window:承载模型 view:显示视图 几个小tip: 1.一个 Activity 构造的时候一定会构造一个 Window(PhoneWindow),并且只有一个 2. ...

  2. Android进阶笔记08:Android 中Activity、Window和View之间的关系

    1. Android 中Activity.Window和View之间的关系(比喻): Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutI ...

  3. Activity Window View的关系

    http://blog.csdn.net/chiuan/article/details/7062215 http://blog.163.com/fenglang_2006/blog/static/13 ...

  4. Android中Bitmap, Drawable, Byte,ID之间的转化

    Android中Bitmap, Drawable, Byte,ID之间的转化 1.  Bitmap 转化为 byte ByteArrayOutputStream out = new ByteArray ...

  5. 【转】Android中dip(dp)与px之间单位转换

    Android中dip(dp)与px之间单位转换 dp这个单位可能对web开发的人比较陌生,因为一般都是使用px(像素)但是,现在在开始android应用和游戏后,基本上都转换成用dp作用为单位了,因 ...

  6. 在Android中动画移动一个View的位置,采用Scroller类实现Android动画之 View移动

    在Android中动画移动一个View的位置,采用Scroller类实现 今天说最近自己遇到的一个问题,就是要用动画效果来移动一个VIew的位置. 这个具体的情况是,需要做一个SlidingMenu的 ...

  7. Android中半透明Activity效果另法

    Android中的Activity有没有类似于像Windows程序样的窗口式显示呢? 答案当然是有. 下图就是一个窗口式Activity的效果图: 下面就说说实现过程: 首先看看AndroidMani ...

  8. 在android中实现webview与javascript之间的交互(转)

    参见“在android中实现webview与javascript之间的交互”

  9. android开发 系统时间与定时器之间有关系嘛?

    如题: android开发 系统时间与定时器之间有关系嘛? 答案:有. 看定时器源码: /* * Schedule a task. */ private void scheduleImpl(Timer ...

  10. Android 中Activity,Window和View之间的关系

    转自:http://hi.baidu.com/xiaofanqing/blog/item/8261ac114ab14f64cb80c435.html 我这里根据我个人的理解来讲讲我个人对这3个概念的理 ...

随机推荐

  1. 【IOS开发—视图控制器】

    一.UIViewController 视图控制器是UIViewController类或者其子类对象,每个视图控制器都负责管理一个视图层次结构.在UIViewController中有一个重要的UIVie ...

  2. 雷神领域(并查集真是个好东西)并查集+流氓dp

    考场上,整整看了半个小时以上的题目!!! 化简题意: 给定一个全0矩阵,一些坐标点(x,y)为1,当三个点可以构成一个直角三角形时(直角边长为整数)拓展为一个矩形,之后从(0,0)出发,求最多的占用行 ...

  3. Linux | 性能分析系列学习 (1)

    学习重点: 把观察到的性能问题跟系统原理关联起来,特别是把系统从应用程序.库函数.系统调用.再到内核和硬件等不同的层级贯穿起来. 主要是四个方面:CPU 性能.磁盘 I/O 性能.内存性能以及网络性能 ...

  4. Linux 学习(1) | 学习方向导图

    方向导图 文件系统导图  内核导图

  5. supervisord进程管理

    一:简介 supervisord是一个进程管理工具,提供web页面管理,能对进程进行自动重启等操作. 优点: - 可以将非后台运行程序后台运行 - 自动监控,重启进程 缺点: - 不能管理后台运行程序 ...

  6. Windows终端利器Cmder

    在IT这一行,大部分情况下都是推荐大家使用Linux或者类Unix操作系统去编程,Linux作为一代优秀的操作系统,已经人尽皆知,在IT行业已经成为核心.有条件的大佬都选择了使用mac编程,最优秀的莫 ...

  7. jdk 错误1316 指定账户已存在 与 jdk1.7安装和配置环境变量 与 jdk1.8与1.7版本的切换使用

    问题:         安装JDK,提示错误信息:,指定的账号已存在. 原因:         安装JDK,相当于安装了一个软件,要使用系统的软件卸载功能卸载,不能只删除安装目录文件夹下的文件,如果只 ...

  8. JavaScript中BOM与DOM的使用

    BOM: 概念:Browser Object Model 浏览器对象模型 将浏览器的各个组成部分封装成对象. 组成: Window:窗口对象 Navigator:浏览器对象 Screen:显示器屏幕对 ...

  9. ios input输入不了

    在项目中遇到了一个问题就是input输入框在安卓可以输入,而在ios输入不了 经过百度,调试发现,在ios中input默认是有user-select: none;属性把input输入框禁用了,将其删除 ...

  10. pat 1006 Sign In and Sign Out(25 分)

    1006 Sign In and Sign Out(25 分) At the beginning of every day, the first person who signs in the com ...