android应用开发之Window,View和WindowManager
2011-07-16 17:12
330 查看
Android Window,View和WindowManager注记
Email: zcatt@163.com
Blog http://zcatt.blog.chinaunix.net
内容提要
Window, View和WindowManager的注记一点.以供备忘和参考。
声明
仅限学习交流,禁止商业用途。转载需注明出处。
版本记录
Date Ver Note
2011-05-24 0.1 Draft. zcatt, Beijing
2011-05-25 0.2 add KeyguardViewHost.
Android中以Window为考察点的话, 涉及的主要接口和类有View, ViewGroup, ViewRoot, Window, PhoneWindow, WindowManagerPolice, PhoneWindowManager, WindowManager, 和WindowManagerImpl.
Window中的View
----------------------
Window是抽象类, PhoneWindow继承实现Window. Android中使用的Window Object实际是PhoneWindow的实例.
Window
PhoneWindow
Window中记录了自己的View, 就是mDecor. DecorView是FrameLayout的子类. mDecor实际是Window中包含的所有View的顶层View.
// This is the top-level view of the window, containing the window decor.
private DecorView mDecor;
// This is the view in which the window contents are placed. It is either
// mDecor itself, or a child of mDecor where the contents go.
private ViewGroup mContentParent;
//... ...
private final class DecorView extends FrameLayout {
//....
}
Window中还记录了一个View, 就是mContentParent, 这就是Window的content view. 实际编程中打交道的都是这个mContentParent. Window在生成自己的mDecor时, 会根据window的属性, 例如是否有title, 是不是dialog等等从预先定义好的layout资源中选择一个载入. 在这些资源中都定义了一个android:id="@android:id/content"的<FrameLayout>. 而这个FrameLayout就是mContentParent指向的layout对象. 可参看installDecor()@PhoneWindow.java. 而setContentView(yourView,...)实际就是将yourView挂接到mContentParent.
ViewRoot, ViewGroup,和View
------------------------------
View的成员变量中有一个指向parent的变量. 而ViewGroup是View的子类,除了有parent, 还有指向自己容纳的子view的mChildren. 而ViewRoot的mView则指向自己唯一的一个子view.
这3个类联合使用就可以组建成一颗颗view的树. ViewRoot是这个树的根点, 各种ViewGroup是树枝, 而各种view是树叶. 在这个树中, ViewRoot的作用很特殊需要特别说明. 对于树的操作通常是从ViewRoot的根节点发动的, 例如requestLayout(), 实际是由ViewRoot的performTraversals()完成.
WindowManager, ViewRoot和View
-------------------------------
WindowManagerImpl是WindowManager的的实现. 它主要用于记录一个3元对应关系<View, ViewRoot, WindowManager.LayoutParams>. 使用addView()加入WindowManger的yourView, 都会自动生成一个ViewRoot做为根点. 这通常是在activity的create后的第一次resume中完成, 而这个view就是window的decor view, 见前. 参考handleResumeActivity()@ActivityThread.java.
public final class ViewRoot extends Handler implements ViewParent
, View.AttachInfo.Callbacks
ViewRoot的所有作用, 或者说它的作用, 就在于它是view树的root. 而且ViewRoot是Handler, 在这里完成相关message的处理工作. 包括的message code如下, 引自源代码.
public final static int DO_TRAVERSAL = 1000;
public final static int DIE = 1001;
public final static int RESIZED = 1002;
public final static int RESIZED_REPORT = 1003;
public final static int WINDOW_FOCUS_CHANGED = 1004;
public final static int DISPATCH_KEY = 1005;
public final static int DISPATCH_POINTER = 1006;
public final static int DISPATCH_TRACKBALL = 1007;
public final static int DISPATCH_APP_VISIBILITY = 1008;
public final static int DISPATCH_GET_NEW_SURFACE = 1009;
public final static int FINISHED_EVENT = 1010;
public final static int DISPATCH_KEY_FROM_IME = 1011;
public final static int FINISH_INPUT_CONNECTION = 1012;
public final static int CHECK_FOCUS = 1013;
public final static int CLOSE_SYSTEM_DIALOGS = 1014;
Acitivity, Window和View
------------------------------
Acitivity在创建后的attach()@Activity.java中创建自己的Window, 继而生成自己的WindowManager. 实际上这个WindowManager都是对process全局的一个singlton WindowManger的wrapper封装. 我们暂称这个singleton WindowManager为核心WindowManager. Activity在首次resume时会将自己的decor view加入到核心WindowManager的记录中. (一个例外, 除了decor view, KeyguardViewHost也会调用WindowManager.addview()加入到核心WindowManager记录中)
这样, 核心WindowManager中记录了process中所有已经首次resume后activity的decore view. '首次resume'实际也是表征了activity应当拥有view了, 可以用于显示了这个概念.
Email: zcatt@163.com
Blog http://zcatt.blog.chinaunix.net
内容提要
Window, View和WindowManager的注记一点.以供备忘和参考。
声明
仅限学习交流,禁止商业用途。转载需注明出处。
版本记录
Date Ver Note
2011-05-24 0.1 Draft. zcatt, Beijing
2011-05-25 0.2 add KeyguardViewHost.
Android中以Window为考察点的话, 涉及的主要接口和类有View, ViewGroup, ViewRoot, Window, PhoneWindow, WindowManagerPolice, PhoneWindowManager, WindowManager, 和WindowManagerImpl.
Window中的View
----------------------
Window是抽象类, PhoneWindow继承实现Window. Android中使用的Window Object实际是PhoneWindow的实例.
Window
PhoneWindow
Window中记录了自己的View, 就是mDecor. DecorView是FrameLayout的子类. mDecor实际是Window中包含的所有View的顶层View.
// This is the top-level view of the window, containing the window decor.
private DecorView mDecor;
// This is the view in which the window contents are placed. It is either
// mDecor itself, or a child of mDecor where the contents go.
private ViewGroup mContentParent;
//... ...
private final class DecorView extends FrameLayout {
//....
}
Window中还记录了一个View, 就是mContentParent, 这就是Window的content view. 实际编程中打交道的都是这个mContentParent. Window在生成自己的mDecor时, 会根据window的属性, 例如是否有title, 是不是dialog等等从预先定义好的layout资源中选择一个载入. 在这些资源中都定义了一个android:id="@android:id/content"的<FrameLayout>. 而这个FrameLayout就是mContentParent指向的layout对象. 可参看installDecor()@PhoneWindow.java. 而setContentView(yourView,...)实际就是将yourView挂接到mContentParent.
ViewRoot, ViewGroup,和View
------------------------------
View的成员变量中有一个指向parent的变量. 而ViewGroup是View的子类,除了有parent, 还有指向自己容纳的子view的mChildren. 而ViewRoot的mView则指向自己唯一的一个子view.
这3个类联合使用就可以组建成一颗颗view的树. ViewRoot是这个树的根点, 各种ViewGroup是树枝, 而各种view是树叶. 在这个树中, ViewRoot的作用很特殊需要特别说明. 对于树的操作通常是从ViewRoot的根节点发动的, 例如requestLayout(), 实际是由ViewRoot的performTraversals()完成.
WindowManager, ViewRoot和View
-------------------------------
WindowManagerImpl是WindowManager的的实现. 它主要用于记录一个3元对应关系<View, ViewRoot, WindowManager.LayoutParams>. 使用addView()加入WindowManger的yourView, 都会自动生成一个ViewRoot做为根点. 这通常是在activity的create后的第一次resume中完成, 而这个view就是window的decor view, 见前. 参考handleResumeActivity()@ActivityThread.java.
public final class ViewRoot extends Handler implements ViewParent
, View.AttachInfo.Callbacks
ViewRoot的所有作用, 或者说它的作用, 就在于它是view树的root. 而且ViewRoot是Handler, 在这里完成相关message的处理工作. 包括的message code如下, 引自源代码.
public final static int DO_TRAVERSAL = 1000;
public final static int DIE = 1001;
public final static int RESIZED = 1002;
public final static int RESIZED_REPORT = 1003;
public final static int WINDOW_FOCUS_CHANGED = 1004;
public final static int DISPATCH_KEY = 1005;
public final static int DISPATCH_POINTER = 1006;
public final static int DISPATCH_TRACKBALL = 1007;
public final static int DISPATCH_APP_VISIBILITY = 1008;
public final static int DISPATCH_GET_NEW_SURFACE = 1009;
public final static int FINISHED_EVENT = 1010;
public final static int DISPATCH_KEY_FROM_IME = 1011;
public final static int FINISH_INPUT_CONNECTION = 1012;
public final static int CHECK_FOCUS = 1013;
public final static int CLOSE_SYSTEM_DIALOGS = 1014;
Acitivity, Window和View
------------------------------
Acitivity在创建后的attach()@Activity.java中创建自己的Window, 继而生成自己的WindowManager. 实际上这个WindowManager都是对process全局的一个singlton WindowManger的wrapper封装. 我们暂称这个singleton WindowManager为核心WindowManager. Activity在首次resume时会将自己的decor view加入到核心WindowManager的记录中. (一个例外, 除了decor view, KeyguardViewHost也会调用WindowManager.addview()加入到核心WindowManager记录中)
这样, 核心WindowManager中记录了process中所有已经首次resume后activity的decore view. '首次resume'实际也是表征了activity应当拥有view了, 可以用于显示了这个概念.
相关文章推荐
- android应用开发之Window,View和WindowManager .
- android应用开发之ImageView,SeekBar,TableHost,ProgressBar的使用
- 【Android开发】onWindowfocuschanged的应用
- Android开发之漫漫长途 Ⅱ——Activity的显示之Window和View(1)
- android webview H5开发若干问题之问题四:webview打开原生应用
- Android - 应用程序信息的flags,系统应用与用户应用,onScrollListener,PopupWindow,View在Window中的位置
- Android开发笔记——TextView的高级应用之文本的淡入淡出
- Android应用开发之自定义View触摸相关工具类全解
- Android应用开发——TextView控件属性列表
- Android应用开发——创建一个带动画效果的View
- Android 开发之漫漫长途 Ⅱ——Activity的显示之Window和View(1)
- Android应用开发:View
- Android 应用开发笔记 - 文本框(TextView)
- Android应用开发—RecyclerView绘制蒙层
- android应用开发全程实录-用户界面部分章节-你真的会用最简单的TextView么?
- Android开发之WebView应用
- Android应用开发中CardView的初步使用指南
- Android应用开发原理之从View源码挖掘View中的事件传递机制
- 【Android 应用开发】Android UI 设计之 TextView EditText 组件属性方法最详细解析
- Android开发之PopupWindow应用(二)