Android 中的Activity、Window、View之间的关系

一、概述  

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

Activity内部组合了一个Window(这是一个抽象类,具体是PhoneWindow)对象。我们自己写的扩展一个Activity时,在onCreate 方法中调用 setContentView,实际上是调用Window对象的 setContentView,所以说界面绘制全部是由Window类的实现类(PhoneWindow类)来完成的。

二、源码分析

  

  1.   跟踪源码进入到 Activity 中看到 setContentView的实现如下:

1  public void setContentView(int layoutResID) {
2         getWindow().setContentView(layoutResID);
3         initActionBar();
4     }

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

1 public Window getWindow() {
2         return mWindow;
3     }

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.  我们要来看看这个类才能知道 界面是如何完成绘制的。

 1  @Override
 2     public void addContentView(View view, ViewGroup.LayoutParams params) {
 3         if (mContentParent == null) {
 4             installDecor();
 5         }
 6         if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
 7             // TODO Augment the scenes/transitions API to support this.
 8             Log.v(TAG, "addContentView does not support content transitions");
 9         }
10         mContentParent.addView(view, params);
11         final Callback cb = getCallback();
12         if (cb != null && !isDestroyed()) {
13             cb.onContentChanged();
14         }
15     }

  先判断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

时间: 2024-10-11 02:40:01

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

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

activity:控制单元 window:承载模型 view:显示视图 几个小tip: 1.一个 Activity 构造的时候一定会构造一个 Window(PhoneWindow),并且只有一个 2.每个window有一个 ViewRoot(是一个View或ViewGroup) 3.通过window的addview方法把元素添加到window上. 4.可以通过 LayoutInflater 的 inflater 方法,可以把一个布局文件转换成view对象 5.界面上的点击等操作是由 Window

Android——UI(1) (activity window decor)

1. activity window decor 之间的关系 android里:1个app里面有一个或多个window1个activity里有1个decor1个window有1个decor1个decor有多个viewgroup/layoutviewgroup/layout中有多个view. activity就是一组相对独立的功能,每个activity有个显示界面,界面显示在窗口上,所以有个窗口. installDecor() //PhoneWindow.java mContentParent =

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

1. Android 中Activity.Window和View之间的关系(比喻): Activity像一个工匠(控制单元),Window像窗户(承载模型),View像窗花(显示视图) LayoutInflater像剪刀,Xml配置像窗花图纸.  2. 详解:       Activity是Android应用程序的载体,允许用户在其上创建一个用户界面,并提供用户处理事件的API,如onKeyEvent, onTouchEvent等. 并维护应用程序的生命周期.Activity本身是个庞大的载体,

Activity、Window、View之间的关系

一.首先说说View和ViewGroup吧 Android系统中的所有UI类都是建立在View和ViewGroup这两个类的基础上的.所有View的子类成为"Widget",所有 ViewGroup的子类成为"Layout".View和ViewGroup之间采用了组合设计模式,可以使得"部分-整体"同等对待. ViewGroup作为布局容器类的最上层,布局容器里面又可以有View和ViewGroup. 二.LayoutInflater,Layou

Android中如何将子View的坐标转换为父View的坐标

最近打算照着Android的Launcher2源码写一个精简的带有拖动功能的Launcher.在分析DragLayer类的时候发现了一个有趣方法——getDescendantCoordRelativeToSelf.通过一下两篇文章的介绍和自己的实验,总算是弄清楚了该方法的原理. http://blog.csdn.net/hahajluzxb/article/details/8165258 http://www.cnblogs.com/platte/p/3534279.html 下面主要分析一下代

Android中半透明Activity效果另法

Android中的Activity有没有类似于像Windows程序样的窗口式显示呢? 答案当然是有. 下图就是一个窗口式Activity的效果图: 下面就说说实现过程: 首先看看AndroidManifest.xml 1: <?xml version="1.0" encoding="utf-8"?> 2: <manifest xmlns:android="http://schemas.android.com/apk/res/android

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

Android中Bitmap, Drawable, Byte,ID之间的转化 1.  Bitmap 转化为 byte ByteArrayOutputStream out = new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); byte[] array= out.toByteArray(); 2. byte转化为bitmap Bitmap bitmap = BitmapFactory.

[转]Android中自定义样式与View的构造函数中的第三个参数defStyle的意义

转自:http://www.cnblogs.com/angeldevil/p/3479431.html Android中自定义样式与View的构造函数中的第三个参数defStyle的意义 零.序 一.自定义Style 二.在XML中为属性声明属性值 1. 在layout中定义属性 2. 设置Style 3. 通过Theme指定 三.在运行时获取属性值 1. View的第三个构造函数的第三个参数defStyle 2. obtailStyledAttributes 3. Example 四.结论与代

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

转自:http://hi.baidu.com/xiaofanqing/blog/item/8261ac114ab14f64cb80c435.html 我这里根据我个人的理解来讲讲我个人对这3个概念的理解.当然这里设计到通用的事件窗口模型等通用GUI设计,我这里就不打算讲了,纯粹从概念上来进行区分. 但在用户级别,程序员可能根愿意理解成为一个界面的载体.但仅仅是个载体,它本身并不负责任何绘制.Activity的内部实现,实际上是聚了一个 Window对象.Window是一个抽象类,它的具体是在an