(1)View:最基本的UI组件,表示屏幕上的一个矩形区域。

(2)Window: 表示一个窗口,不一定有屏幕那么大,可以很大也可以很小;
                         它包含一个View tree和窗口的layout 参数。
                         View tree的root View可以通过getDecorView得到。还可以设置Window的Content View。

(3)Activity:Activity包含一个Window,该Window在Activity的attach方法中通过调用
                      PolicyManager.makeNewWindo创建

(4)WindowManager:一个interface,继承自ViewManager。 有一个implementation

(5)class:android.view.WindowManagerImpl
       
       其实WindowManager并不是整个系统的窗口管理器,而是所在应用进程的窗口管理器。系统全局的窗口管理器运行在SystemServer进程中,是一个Service。
      
       ViewRoot通过IWindowSession接口与全局窗口管理器进行交互。 将一个View add到WindowManager时,WindowManagerImpl创建一个ViewRoot来管理该窗口的根View。并通过ViewRoot.setView方法把该View传给ViewRoot。
       
       ViewRoot用于管理窗口的根View,并和global window manger进行交互。ViewRoot中有一个nested class: W,W是一个Binder子类,用于接收global window manager的各种消息, 如按键消息, 触摸消息等。 ViewRoot有一个W类型的成员mWindow,ViewRoot在Constructor中创建一个W的instance并赋值给mWindow。 ViewRoot是Handler的子类, W会通过Looper把消息传递给ViewRoot。 ViewRoot在setView方法中把mWindow传给sWindowSession。

ActivityThread.java中调用wm.addView(decor, l);把它加入到window manager 
proxy的mViews中,同时为这个decor view创建一个ViewRoot,ViewRoot负责协调decor view与window 
manager直接绘图、事件处理。

ViewRoot中有IWindowSession和IWindow用来和window manger打交道和接收window 
manager传过来的消息,消息传过来后ViewRoot分发给decor view,再由decor view进行分发

   总之,每个窗口对应着一个Window对象,一个根View和一个ViewRoot对象。要想创建一个窗口,可以调用
WindowManager的addView方法,作为参数的view将作为在该窗口上显示的根view

一般来讲,Activity就是一 个可视的人机交互界面。
每一个Activity都有一个默认的Window,一 般来讲,这个Window都是全屏的,当然也有例外,比如Dialog的Window就是非全屏的。Activity也可以利用默认Window以外的其 它的Window,比如弹出一个Dialog对话框。6 i8 J' I' b+ v. F% r 
Window里可见的内容,就是一层一层的View。Window里的View是通过 setContentView这个接口set进去的,这个ContentView就是Window里处于最根部的View。

 
 
对于屏幕显示而 言,整个是Activity 其实确切的说是window,为什么这样说呢?

在Activityattach 函数里.有这样一句 mWindow = PolicyManager.makeNewWindow(this);

这句是把Activiyt window关联起来了.真正关联的是PhoneWindow.

这个window里显示的东西是view(activity是逻辑上的东 西,增加了生命周期管理等. 里面具体的东西也是view。而且启动activity的实现也是往window里加view),往window里加view,是通过调用 WindowManager(WindowManagerImpl).addView()来实现的。

为什么可以这样说呢?

看public void setContentView(int layoutResID) {
        getWindow().setContentView(layoutResID);
    }

在 addView里,会为每个view创建一个viewRoot(这是逻辑上的东西,用来负责view的事件处理和逻辑处理,并和 WindowsManagerService建立联系),而在WindowManagerImpl里,会维护viewRoot的数组。

最 终会调用ViewRoot.setView(),在setView里会显示该view等。在setView的实现里,会调用Session.add()来 addWindow,通过这个方法,会将ViewRoot和WindowManagerService联系起来(比如说分发事件等),并且这个方法里会调 用PhoneWindowManager.prepareAddWindowLw()。

这只是模糊概念,还有细节需要推敲,我会继续努 力.如果你感觉是这么会事,你得给我顶了,我也不容易的.都很辛苦啊.

 

android 中View, Window, Activity, WindowManager,ViewRoot几者之间的关系的更多相关文章

  1. android 中的 window,view,activity具体关系

    通过讨论这个问题,我们能够见识到google是对面向对象模式的理解,能够理解android底层的一些调用.这也是一道很常见的面试题. 我们这篇文章就来解决这四个问题: Android  中view的显 ...

  2. Android中View和ViewGroup介绍

    1. 概念Android中的View与我们以前理解的“视图”不同.在Android中,View比视图具有更广的含义,它包含了用户交互和显示,更像Windows操作系统中的window. ViewGro ...

  3. Android 中View的绘制机制源代码分析 一

    尊重原创: http://blog.csdn.net/yuanzeyao/article/details/46765113 差点儿相同半年没有写博客了,一是由于工作比較忙,二是认为没有什么内容值得写, ...

  4. Android中View绘制流程以及invalidate()等相关方法分析

    [原文]http://blog.csdn.net/qinjuning 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简 ...

  5. Android中View绘制流程以及invalidate()等相关方法分析(转载的文章,出处在正文已表明)

    转载请注明出处:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时 ...

  6. Android中View绘制流程以及invalidate()等相关方法分析(转)

    转自:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴 ...

  7. 分析Android中View的工作流程

    在分析View的工作流程时,需要先分析一个很重要的类,MeasureSpec.这个类在View的测量(Measure)过程中会用到. MeasureSpec MeasureSpec是View的静态内部 ...

  8. Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

    Android中View的绘制过程 onMeasure方法简述 附有自定义View例子 Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android fr ...

  9. Android中突发情况Activity数据的保存和恢复

    Android中突发情况Activity数据的保存和恢复 写在前面:在我们的APP使用的过程中,总有可能出现各种手滑.被压在后台.甚至突然被杀死的情况.所以对APP中一些临时数据或关键持久型数据,就需 ...

随机推荐

  1. JavaScript 中的数字和日期类型

    本章节介绍如何掌握Javascript里的数字和日期类型 数字EDIT 在 JavaScript 里面,数字都是双精度浮点类型的 double-precision 64-bit binary form ...

  2. Android开发 解决AlertDialog中的EditText无法调出输入法的问题

    在AlertDialog中使用自定义的View,如果View中有EditText,在上面点击,默认是跳不出软键盘的,不是焦点的问题.解决方法,有两种,一是把AlertDialog换成Dialog,但这 ...

  3. Qt入门(4)——Qt常见控件

    Qt提供了大量的内建控件及通用对话框可满足程序员的绝大部分要求.我们将对这些控件和对话框作一个大概的介绍. 1. QLabel 定义 QLabel* m_labelOrdered = newQLabe ...

  4. 【转】Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)

    原文网址:http://embed.21ic.com/software/android/201403/31603.html 1 :Android中Spinner下拉列表(使用ArrayAdapter和 ...

  5. iOS开发手记 - iOS9.3 Xcode7打包ipa文件在其他越狱机器上运行的方法和一些问题

    现在Xcode7可以用一个appleid就可以往手机上部署测试app,不再需要$99,这也是方便.但是要把app发给别人的手机上运行还是不行,除非别人的手机在你身边可以直接通过Xcode安装 关于怎么 ...

  6. SRM 585 DIV1

    A 树形dp是看起来比较靠谱的做法 , 但是转移的时候不全面就会出错 , 从贪心的角度出发 , 首先让第一量车走最长路, 然后就会发现递归结构 , 得到递归式 f[i] = ( f[i-2] + f[ ...

  7. Java枚举7常见种用法

    DK1.5引入了新的类型——枚举.在Java中它虽然算个“小”功能,却给我的开发带来了“大”方便. 方法/步骤 用法一:常量 在JDK1.5之前,我们定义常量都是:publicstaticfianl. ...

  8. 解析了grid2008的代码

    import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.L ...

  9. synchronized 与 Lock 的那点事

    最近在做一个监控系统,该系统主要包括对数据实时分析和存储两个部分,由于并发量比较高,所以不可避免的使用到了一些并发的知识.为了实现这些要求,后台使用一个队列作为缓存,对于请求只管往缓存里写数据.同时启 ...

  10. JSTL配合正则表达式在JSP中的应用

    <%@ page language="java" import="java.util.*,cn.com.Person" pageEncoding=&quo ...