- 浏览: 567713 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (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)
最新评论
android ViewRoot学习,WindowManager和ViewRoot的关系
- 博客分类:
- android
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 9431 概述 多模块Activity+多Fragment 是开发 ... -
android ScrollView常用属性
2016-05-09 09:17 652android:scrollbars 设置滚动条显示。none ... -
android RecyclerView使用及详解
2016-05-04 10:35 28481.前言 话说RecyclerView已经面市很久,也在很多 ... -
android DialogFragment 创建对话框(官方推荐)
2016-04-29 14:22 8511、 概述 DialogFragment在android 3. ... -
android Intent Flags及Task相关属性
2016-04-26 09:15 558task是一个具有栈结构的容器,可以放置多个Activity实 ... -
android SQLite具体实例应用详解(SQLiteOpenHelper)
2016-04-18 19:24 758上次我向大家介绍了SQLite的基本信息和使用过程,相信朋友们 ... -
android SQLite3常用命令&语法
2016-04-18 19:01 557sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常 ... -
android View绘制相关问题总结
2016-03-28 19:27 6301.View的绘制流程分几步 ... -
android Handler Looper MessageQueue机制的原理
2016-03-22 21:09 716andriod提供了Handler和Looper来满足线程间的 ... -
android Bitmap,BitmapFactory类图像处理
2016-03-16 16:28 2314BitMap代表一张位图,扩展名可以是.bmp或者.dib。 ... -
android 三类菜单(Option) (Context) (SubMenu)学习
2016-03-14 15:23 862在Android系统中,菜单可以分为三类:选项菜单(Optio ... -
android Sqlite数据库对象模型ORMLite框架学习
2016-03-11 15:24 661在Android项目中或多或少的都会使用数据库,为了提高我们的 ... -
android AsyncTask<参数,进度值类型,返回类型>学习
2016-03-10 14:45 1129AsyncTask和Handler对比 1 ... -
android 远程图片获取和本地缓存
2016-03-10 14:32 706概述 对于客户端——服 ... -
android onSaveInstanceState和onRestoreInstanceState学习
2016-03-10 10:08 736Android中的activity通过onSaveInst ... -
android Fragment生命周期和回退栈学习以及Fragment之间通信
2016-03-10 09:31 1480会涉及到Fragment如何产生,什么是Fragment,Fr ... -
android LruCache内存缓存学习(重写sizeOf方法)
2016-03-09 19:25 1007什么是缓存? 缓存技术原理就是把用户访问的所有对象看作一个全 ... -
android ListView中的convertView缓存及使用
2016-03-09 19:12 1654一、复用convertView 首先讲下ListView的原 ... -
android 从资源角度谈Android代码内存优化
2016-03-09 18:54 652开发人员如果在进行代码编写之前就有内存泄露方面的基础知识,那么 ... -
android startActivityForResult和setResult详情及Demo
2016-03-09 08:56 997startActivityForResult与startAct ...
相关推荐
android13 WindowManager-Shell.jar
主要为大家详细介绍了Android利用WindowManager实现悬浮窗效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Android悬浮窗实现 使用WindowManager实现像电视顶端文字广告栏效果,开发工具:AS
主要分析更新view的实现过程:实现触摸事件监听,重写onTouch()方法,在ActionDown时,利用getRawX和getRawY得到x1、y1,在ActionMove时,利用getX和getY获取移动过程的x2、y2,两者作差后作为更新的view对应的xy...
android 采用windowmanager屏蔽home键
利用windowmanager的addview()方法制作的弹出式窗口,可以手指跟随,点击根据状态可以展开或者伸缩。
主要为大家详细介绍了Android自定义Toast之WindowManager的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
仿360悬浮窗,WindowManager的使用
这个是一个悬浮框权限的判断代码,基本涵盖市面上主流手机的判断,可以直接下载使用,测试过,非常的好用
你会发现QQ视频的时候,就算手机回到主页,视频小模块依旧能悬浮在桌面上。还有当年很火的各种手机杀毒软件的桌面小助手,总能在呆在桌面。这种悬浮窗的操作就需要用到Window。
创建一个Window,需要通过WindowManager即可完成,WindowManager是外界访问Window的入口,Window具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC的过程。Android中,所有...
一个WindowManager悬浮窗,悬浮显示歌词效果。WindowManager背景设置为了透明色,显示的WindowManager关闭启动它的Activity回到主界面仍然有效。仅供参考............
android surfaceview圆角
WindowManager属性详解:WindowManager.LayoutParams 是 WindowManager 接口的嵌套类;继承于 ViewGroup.LayoutParams 。 它的内容十分丰富。其实WindowManager.java的主要内容就是由这个类定义构成。
Window是一个抽象类,具体实现是 PhoneWindow 。不管是 Activity 、 Dialog 、 Toast 它们的视图都是附加在Window上的,因此Window实际上是View的直接管理者。
主要为大家详细介绍了Android使用WindowManager构造悬浮view的具体方法,感兴趣的小伙伴们可以参考一下
window、windowmanager的分析
主要为大家详细介绍了Android使用WindowManager制作一个可拖动的控件的相关资料,感兴趣的小伙伴们可以参考一下