- 浏览: 595989 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
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有关的代码有如下几句:
4、ViewRoot和WindowManagerImpl的关系
在早期的系统版本中,WindowManagerImpl在每个进程中只有一个实例。调用它必须使用如下语句:
在WindowMangerImpl内部,存在3个全局变量:(下图中的源码是2.3.5中的)
它们分别用于表示View树的根节点、ViewRoot以及Window的属性。由此也可以看出,一个进程中不仅有一个ViewRoot;
而Activity与ViewRoot则是一对一的关系。
自Android4.3开始对此做了修改,WindowManagerImpl不再直接存储上述三个数组变量,而是由一个称为“WindowMangerGlobal”的类统一管理。
5、ViewRoot和WindowManagerService的关系
每一个ViewRootImpl内部,都有一个全局变量
这个变量用于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。
它的主要作用如下:
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。
发表评论
文章已被作者锁定,不允许评论。
-
android BaseActivity与BaseFragment的封装
2016-05-19 15:06 10141 概述 多模块Activity+多Fragment 是开发 ... -
android ScrollView常用属性
2016-05-09 09:17 714android:scrollbars 设置滚动条显示。none ... -
android RecyclerView使用及详解
2016-05-04 10:35 29051.前言 话说RecyclerView已经面市很久,也在很多 ... -
android DialogFragment 创建对话框(官方推荐)
2016-04-29 14:22 9141、 概述 DialogFragment在android 3. ... -
android Intent Flags及Task相关属性
2016-04-26 09:15 626task是一个具有栈结构的容器,可以放置多个Activity实 ... -
android SQLite具体实例应用详解(SQLiteOpenHelper)
2016-04-18 19:24 822上次我向大家介绍了SQLite的基本信息和使用过程,相信朋友们 ... -
android SQLite3常用命令&语法
2016-04-18 19:01 624sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常 ... -
android View绘制相关问题总结
2016-03-28 19:27 6901.View的绘制流程分几步 ... -
android Handler Looper MessageQueue机制的原理
2016-03-22 21:09 773andriod提供了Handler和Looper来满足线程间的 ... -
android Bitmap,BitmapFactory类图像处理
2016-03-16 16:28 2375BitMap代表一张位图,扩展名可以是.bmp或者.dib。 ... -
android 三类菜单(Option) (Context) (SubMenu)学习
2016-03-14 15:23 929在Android系统中,菜单可以分为三类:选项菜单(Optio ... -
android Sqlite数据库对象模型ORMLite框架学习
2016-03-11 15:24 715在Android项目中或多或少的都会使用数据库,为了提高我们的 ... -
android AsyncTask<参数,进度值类型,返回类型>学习
2016-03-10 14:45 1191AsyncTask和Handler对比 1 ... -
android 远程图片获取和本地缓存
2016-03-10 14:32 785概述 对于客户端——服 ... -
android onSaveInstanceState和onRestoreInstanceState学习
2016-03-10 10:08 806Android中的activity通过onSaveInst ... -
android Fragment生命周期和回退栈学习以及Fragment之间通信
2016-03-10 09:31 1538会涉及到Fragment如何产生,什么是Fragment,Fr ... -
android LruCache内存缓存学习(重写sizeOf方法)
2016-03-09 19:25 1069什么是缓存? 缓存技术原理就是把用户访问的所有对象看作一个全 ... -
android ListView中的convertView缓存及使用
2016-03-09 19:12 1716一、复用convertView 首先讲下ListView的原 ... -
android 从资源角度谈Android代码内存优化
2016-03-09 18:54 726开发人员如果在进行代码编写之前就有内存泄露方面的基础知识,那么 ... -
android startActivityForResult和setResult详情及Demo
2016-03-09 08:56 1057startActivityForResult与startAct ...
相关推荐
ViewRoot在Android系统中是一个不可或缺的组件,它不仅连接了应用层与系统层,还在事件分发和GUI渲染中扮演着核心角色。通过理解ViewRoot的工作机制及其与其他组件之间的交互,开发者能够更好地优化应用程序的性能和...
在Android平台上,截屏功能通常是系统级别的,一般用户可以通过电源键和音量键组合来触发。然而,对于开发者来说,有时候...学习和理解这个例子,对于提升Android开发技能,特别是对系统级API的运用,是非常有益的。
5. **WindowManagerService.finishDrawingWindow**: 在完成绘制后,ViewRoot会调用此方法通知WindowManager Service完成窗口的绘制。 #### 五、总结 Android图形架构的核心在于协调不同组件之间的交互,确保高效的...
客户端由Window、View、ViewRoot(连接View和Window系统的桥梁)以及WindowManager代理(与Service通信的中介)组成。 4. **窗口管理流程** - Activity启动时,通过`performLaunchActivity`创建PhoneWindow。 - `...
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线程的继续执行,到达makeVisible()时,根View(即DecoView)将被加入WindowManager,触发ViewRoot的创建。每个ViewRoot对应一个Surface,而Surface则由底层的SurfaceFlinger库管理,负责图形绘制内存...
标题和描述均聚焦于“Android与Symbian应用程序框架”的对比分析,这要求我们深入探讨两个操作系统中的应用程序架构,特别是它们在消息传递、绘图、窗口与控件管理以及输入法处理上的差异。 ### Symbian应用程序...
`ViewRoot`是连接View和WindowManager的关键组件,它负责处理View的绘制和事件分发。当一个View被添加到Window时,`ViewRoot`会创建并关联到这个View。`ViewRoot`内部有一个名为`W`的Binder子类,用于与全局Window ...
ViewRoot是一个Handler,作为View与WindowManager通信的中介。动画的绘制过程涉及递归地绘制整个窗口,包括绘制背景、可能的层保存、View内容的绘制以及子View的递归绘制。 在Android中,动画主要分为两种类型:帧...
- **ViewRoot和DecorView**:DecorView是顶级窗口,ViewRoot是View与Window交互的桥梁。 - **MeasureSpec**:MeasureSpec是尺寸约束,用于测量View的大小。 - **自定义View**:了解如何根据需求定制View,包括...
- 获取Root View:首先,你需要获取到设备的根视图(Root View),这通常是`WindowManager.getDefaultDisplay().getDecorView()`。 - 遍历View层次结构:遍历整个视图树,确保所有子视图都被考虑在内。这一步可以...
1. 获取全局屏幕截图:在Android中,我们可以利用`WindowManager`获取到设备的根视图(root view),然后遍历整个视图树,将每个View的像素内容合并成一张完整的截图。关键代码如下: ```java View rootView = ...
在Android中,可以使用`WindowManager`和`View`类来获取屏幕内容。以下是一个简单的实现步骤: 1. 获取顶级视图(root view): ```java View decorView = activity.getWindow().getDecorView(); decorView....
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...
Class<?> viewServerClass = Class.forName("android.view.ViewServer$WindowManager"); Method method = viewServerClass.getMethod("start"); method.invoke(null); } catch (Exception e) { Log.e("View...
ViewRoot继承自Handler,作为WmS与客户端间通信的枢纽,负责接收来自WmS的指令,执行相应的窗口操作。W类作为Binder的子类,用于实现跨进程通信,确保服务端与客户端之间的数据交换。 **5. WindowManager类** ...
2. **获取屏幕快照**:可以使用`WindowManager`和`View`类来获取当前活动的顶级视图,然后调用`draw()`方法将视图绘制到`Bitmap`对象上。代码可能如下: ```java View rootView = activity.getWindow()....
View view = findViewById(R.id.root_view); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap bitmap = view.getDrawingCache(); // 可以对bitmap进行保存或处理 view.setDrawingCacheEnabled...
ERROR/AndroidRuntime(888): android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRoot$W@44ef1b68 is not valid; is your activity running? 报错的意思大概就是说...