【android 中View, Window, Activity, WindowManager,ViewRoot几者之间的关系】博观而约取,厚积而薄发。这篇文章主要讲述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()。
这仅仅是模糊概念。还有细节须要推敲,我会继续努 力.假设你感觉是这么会事。你得给我顶了,我也不easy的.都非常辛苦啊.
。
推荐阅读
- android 逆向
- Visio2007怎样创建基本框图_其它办公
- Visio2007添加新的填充、线端图案、线型办法_其它办公
- Visio2007形状添加导入数据图文详细教程_其它办公
- Visio2007依据形状的数据着色技巧_其它办公
- Visio2007怎样创建灵感触发图_其它办公
- Visio2007怎样构造数据图形_其它办公
- Visio2007阴影怎样用于闭合或开放形状?_其它办公
- Visio2007设置文本块与形状格式技巧_其它办公