`

android ViewRoot学习,WindowManager和ViewRoot的关系

 
阅读更多
ViewRoot是GUI管理系统与GUI呈现系统之间的桥梁,根据ViewRoot的定义,我们发现它并不是一个View类型,而是一个Handler。

它的主要作用如下:

A. 向DecorView分发收到的用户发起的event事件,如按键,触屏,轨迹球等事件;

B. 与WindowManagerService交互,完成整个Activity的GUI的绘制。

1、View和ViewRoot
ViewRoot从名称上来理解似乎是“View树的根”,这很容易让人产生误解。
因为ViewRoot并不属于View树的一份子。从源码实现上来看,ViewRoot和View对象并没有任何“血缘”关系,它既非View的子类,也非View的父类。
ViewRoot可以被理解为“View树的管理者”——它有一个mView成员变量,指向的是它所管理的View树的根。



在该布局中,ViewRoot中的mView成员变量指向的就是它所管理的View树的根,即上图中的LinearLayout:test元素。ViewRoot的核心任务就是与WindowManagerService进行通信。

2、Activity和Window的关系
我们知道Activity是支持显示UI的,那么它是否直接管理view树或者ViewRoot呢?答案是否定的,Activity并没有与这两者产生直接的联系,因为这中间还有一个被称为“Window”的对象。
大家可以在Activity的源码中找到如下代码:private Window mWindow; Window的字面意思是窗口,这很好地解释了它存在的意义。
Window是基类,根据不同的产品可以衍生出不同的子类——具体则是由系统在Activity.attach中调用PolicyManager.makeNewWindow决定的,目前版本的Android系统默认生成的都是PhoneWindow

3、Window和WindowManagerImpl的关系
在Android源码中以“Window”开头的类有不少,Window,WindowManager,WindowManagerImpl等,为什么需要这么多相似的类呢?
先来看Window,它是面向Activity的,表示UI界面的外框;
而“框里面”具体的东西包括布局和内容等,是由具体的Window子类,如PhoneWindow来规划的。 Window的另一层含义是要与WindowManagerService进行通信,但它并没有直接在自身实现这一功能。
原因是:一个应用程序中很可能存在多个Window。
如果它们都单独与WMS通信,那么既浪费资源,又会造成管理的混乱。换句话说,它们需要统一的管理。
于是就有了WindowManager,
它作为Window的成员变量mWindowManager存在。这个WindowManager是一个接口类,其真正的实现是WindowManagerImpl,后者同时也是整个应用程序中所有Window的管理者。因而WindowManager与WindowManagerImpl的关系有点类似于“地方与中央”:地方为实施中央的“政策”提供了一个接口,然后汇总到中央进行管理。 在Window的源码中与mWindowMager有关的代码有如下几句:
private WindowManager mWindowManager;
 mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);


4、ViewRoot和WindowManagerImpl的关系
在早期的系统版本中,WindowManagerImpl在每个进程中只有一个实例。调用它必须使用如下语句:
WindowManagerImpl.getDefault();

在WindowMangerImpl内部,存在3个全局变量:(下图中的源码是2.3.5中的)

它们分别用于表示View树的根节点、ViewRoot以及Window的属性。由此也可以看出,一个进程中不仅有一个ViewRoot;
而Activity与ViewRoot则是一对一的关系。
自Android4.3开始对此做了修改,WindowManagerImpl不再直接存储上述三个数组变量,而是由一个称为“WindowMangerGlobal”的类统一管理。

5、ViewRoot和WindowManagerService的关系
每一个ViewRootImpl内部,都有一个全局变量
static IWindowSession sWindowSession; 

这个变量用于ViewRoot到WMS的连接,它是ViewRoot利用WMS的openSession()方法来创建得到的。
在此基础上,ViewRoot也会通过IWindowSession.add()方法提供一个IWindow对象——从而让WMS也可以通过这个IBinder对象来与ViewRoot进行双向通信。 这里突然间冒出一个ViewRootImpl类,其实ViewRoot与ViewRootImpl的功能是一样的,只不过是Android不同版本的不同称呼。

其实每个Application都有一个ActivityThread主线程以及mActivities全局变量后者记录了运行在应用程序中的所有Activity对象。

一个Activity对应唯一的WindowManager以及ViewRootImpl。WindowManagerGlobal作为全局管理者,其内部的mRoots和mViews记录了Activity的ViewRootImpl和View树的顶层元素。

ViewRootImpl的另一个重要角色就是负责与WMS通信。从ViewRootImpl到WMS间的通信利用的是IWindowSession,而反方向则是由IWindow来完成的。
最后补充说明一点:Activity中有一个成员变量mWindow,mWindow里面有一个成员变量mWindowManager,而mWindowManager是WindowMangerImpl类实例的引用,另外WindowMangerImpl里面包含ViewRoot。













  • 大小: 20.3 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    联想 viewroot简介

    ViewRoot在Android系统中是一个不可或缺的组件,它不仅连接了应用层与系统层,还在事件分发和GUI渲染中扮演着核心角色。通过理解ViewRoot的工作机制及其与其他组件之间的交互,开发者能够更好地优化应用程序的性能和...

    免root实现截屏Android例子源码

    在Android平台上,截屏功能通常是系统级别的,一般用户可以通过电源键和音量键组合来触发。然而,对于开发者来说,有时候...学习和理解这个例子,对于提升Android开发技能,特别是对系统级API的运用,是非常有益的。

    Android Graphics Architecture.pdf

    5. **WindowManagerService.finishDrawingWindow**: 在完成绘制后,ViewRoot会调用此方法通知WindowManager Service完成窗口的绘制。 #### 五、总结 Android图形架构的核心在于协调不同组件之间的交互,确保高效的...

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

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

    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 ...

    Android自定义组件解析[郝留有]

    随着Activity线程的继续执行,到达makeVisible()时,根View(即DecoView)将被加入WindowManager,触发ViewRoot的创建。每个ViewRoot对应一个Surface,而Surface则由底层的SurfaceFlinger库管理,负责图形绘制内存...

    android与symbian应用程序框架

    标题和描述均聚焦于“Android与Symbian应用程序框架”的对比分析,这要求我们深入探讨两个操作系统中的应用程序架构,特别是它们在消息传递、绘图、窗口与控件管理以及输入法处理上的差异。 ### Symbian应用程序...

    Android中View绘制流程详细介绍

    `ViewRoot`是连接View和WindowManager的关键组件,它负责处理View的绘制和事件分发。当一个View被添加到Window时,`ViewRoot`会创建并关联到这个View。`ViewRoot`内部有一个名为`W`的Binder子类,用于与全局Window ...

    Android图形处理.ppt

    ViewRoot是一个Handler,作为View与WindowManager通信的中介。动画的绘制过程涉及递归地绘制整个窗口,包括绘制背景、可能的层保存、View内容的绘制以及子View的递归绘制。 在Android中,动画主要分为两种类型:帧...

    Android开发艺术探索1

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

    Android 截屏 和录制屏幕

    - 获取Root View:首先,你需要获取到设备的根视图(Root View),这通常是`WindowManager.getDefaultDisplay().getDecorView()`。 - 遍历View层次结构:遍历整个视图树,确保所有子视图都被考虑在内。这一步可以...

    Android 自定义区域截图实现

    1. 获取全局屏幕截图:在Android中,我们可以利用`WindowManager`获取到设备的根视图(root view),然后遍历整个视图树,将每个View的像素内容合并成一张完整的截图。关键代码如下: ```java View rootView = ...

    android截取屏幕图片

    在Android中,可以使用`WindowManager`和`View`类来获取屏幕内容。以下是一个简单的实现步骤: 1. 获取顶级视图(root view): ```java View decorView = activity.getWindow().getDecorView(); decorView....

    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...

    开启view server的方法

    Class<?> viewServerClass = Class.forName("android.view.ViewServer$WindowManager"); Method method = viewServerClass.getMethod("start"); method.invoke(null); } catch (Exception e) { Log.e("View...

    Android核心剖析之Framework概述

    ViewRoot继承自Handler,作为WmS与客户端间通信的枢纽,负责接收来自WmS的指令,执行相应的窗口操作。W类作为Binder的子类,用于实现跨进程通信,确保服务端与客户端之间的数据交换。 **5. WindowManager类** ...

    免root实现截屏源码.zip

    2. **获取屏幕快照**:可以使用`WindowManager`和`View`类来获取当前活动的顶级视图,然后调用`draw()`方法将视图绘制到`Bitmap`对象上。代码可能如下: ```java View rootView = activity.getWindow()....

    android 屏幕截屏源码分享

    View view = findViewById(R.id.root_view); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap bitmap = view.getDrawingCache(); // 可以对bitmap进行保存或处理 view.setDrawingCacheEnabled...

    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? 报错的意思大概就是说...

Global site tag (gtag.js) - Google Analytics