`
vssupermadman
  • 浏览: 23207 次
社区版块
存档分类
最新评论

android 中View, Window, Activity, WindowManager,ViewRoot几者之间的关系

阅读更多

(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()。

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



 

分享到:
评论
2 楼 woyaowenzi 2013-07-25  
woyaowenzi 写道
最后一句话很有意思啊。哈哈哈哈。

再看了下,感觉一股强烈的屌丝气场铺面而来。
1 楼 woyaowenzi 2013-07-24  
最后一句话很有意思啊。哈哈哈哈。

相关推荐

    联想 viewroot简介

    ViewRoot在Android UI架构中扮演着非常关键的角色,它是GUI管理系统与GUI渲染系统之间的桥梁。具体而言,ViewRoot的主要职责包括: 1. **事件分发**:向DecorView分发用户产生的事件,比如按键、触摸屏操作或轨迹球...

    Android 核心分析(13) -----Android GWES之Android窗口管理.doc

    客户端由Window、View、ViewRoot(连接View和Window系统的桥梁)以及WindowManager代理(与Service通信的中介)组成。 4. **窗口管理流程** - Activity启动时,通过`performLaunchActivity`创建PhoneWindow。 - `...

    Android中View绘制流程详细介绍

    接着,Activity的根View会被添加到WindowManager中,此时,`WindowManagerImpl`会创建一个`ViewRoot`来管理这个根View。 **DecorView的创建** DecorView是Window的最顶层View,它是`PhoneWindow`的内部类,继承自`...

    Android Graphics Architecture.pdf

    2. **ViewRoot.setView**: 此方法用于设置ViewRoot的视图层级,并最终通过`WindowManagerService.addWindow()`方法将新窗口添加到系统中。 3. **ViewRoot.performTraversals**: 该方法包含了视图层级结构的测量、...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    4.1 初识ViewRoot和DecorView 174 4.2 理解MeasureSpec 177 4.2.1 MeasureSpec 177 4.2.2 MeasureSpec和LayoutParams的对应关系 178 4.3 View的工作流程 183 4.3.1 measure过程 183 4.3.2 layout过程 193 ...

    Activity实现透明的最简洁Demo

    在XML布局文件中,将根视图(root view)的背景色设置为透明,如下所示: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:...

    Android开发艺术探索

     4.1 初识ViewRoot和DecorView / 174  4.2 理解MeasureSpec / 177  4.2.1 MeasureSpec / 177  4.2.2 MeasureSpec和LayoutParams的对应关系 / 178  4.3 View的工作流程 / 183  4.3.1 measure过程 / 183  4.3.2...

    Android开发艺术探索1

    - **ViewRoot和DecorView**:DecorView是顶级窗口,ViewRoot是View与Window交互的桥梁。 - **MeasureSpec**:MeasureSpec是尺寸约束,用于测量View的大小。 - **自定义View**:了解如何根据需求定制View,包括...

    android与symbian应用程序框架

    在Android中,`Canvas`与Symbian中的`GC`相对应,但绘图机制有所不同。`View`是被动接受由`ViewRoot`提供的`canvas`,并在其上进行绘图。这个过程类似于Symbian中使用`SystemGc`进行绘图。`ViewRoot`还与`surface`...

    Android下Activity全屏显示实现方法

    本篇文章将详细阐述两种在Android中实现Activity全屏显示的方法。 ### 方法一:通过XML配置 在AndroidManifest.xml文件中,我们可以针对特定的Activity设置主题(Theme),从而实现全屏效果。有两种不同的选项: ...

    view面试专题.docx

    2. **View与ViewRoot的关联** - 在`handleResumeActivity`时,`Activity`的`onResume`方法被调用。 - `WindowManager`将`DecorView`设置给`ViewRootImpl`。 - 此时`DecorView`加载到了`Window`中。 3. **View的...

    Android区域截屏

    在Android系统中,区域截屏是一项非常实用的功能,它允许用户截取屏幕的一部分而不是整个屏幕。这在处理长页面、隐私保护或者仅需分享部分信息时尤其方便。本篇文章将详细探讨Android区域截屏的实现原理、使用方法...

    软键盘遮住悬浮窗的EditText、软键盘消失无法监听返回键

    Android系统中的窗口(Window)分为多个层次,通常包括Activity、Dialog、PopupWindow等。当软键盘弹出时,它会调整当前窗口的布局,使输入框位于可见区域。对于悬浮窗(通常是使用PopupWindow或FloatingWindow实现...

    Android开发解决popupWindow重叠报错问题

    ERROR/AndroidRuntime(888): android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRoot$W@44ef1b68 is not valid; is your activity running? 报错的意思大概就是说...

    Android 获取屏幕高度,标题高度,状态栏高度(实例代码)

    View contentRoot = findViewById(Window.ID_ANDROID_CONTENT); int contentTop = contentRoot.getTop(); int titleBarHeight = contentTop - statusBarHeight; ``` 此外,还可以使用其他方式获取屏幕和状态栏...

    亲测可用 e4a 易安卓 BG悬浮窗类库 类库 易安卓悬浮窗类库 e4a悬浮窗

    1. **悬浮窗权限**:在AndroidManifest.xml文件中,开发者需要添加悬浮窗权限,即`<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>`。从Android 6.0 (API level 23)开始,用户需要在运行...

    基于Android实现桌面悬浮清内存app概述

    Android中的悬浮窗口通常通过`WindowManager`服务来实现,它允许我们将视图添加到窗口层次结构中,使其显示在所有其他应用之上。关键代码如下: ```java WindowManager windowManager = (WindowManager) context....

Global site tag (gtag.js) - Google Analytics