转自:http://songzhangzhang.blog.163.com/blog/static/694019812011119114235661/
View:最基本的UI组件,表示屏幕上的一个矩形区域。
Window: 表示一个窗口,包含一个View tree和窗口的layout 参数。View tree的root View可以通过getDecorView得到。还可以设置Window的Content View。
Activity包含一个Window,该Window在Activity的attach方法中通过调用PolicyManager.makeNewWindow创建。
WindowManager:一个interface,继承自ViewManager。 有一个implementation 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。
总之,每个窗口对应着一个Window对象,一个根View和一个ViewRoot对象。要想创建一个窗口,可以调用WindowManager的addView方法,作为参数的view将作为在该窗口上显示的根view。
分享到:
相关推荐
ViewRoot在Android UI架构中扮演着非常关键的角色,它是GUI管理系统与GUI渲染系统之间的桥梁。具体而言,ViewRoot的主要职责包括: 1. **事件分发**:向DecorView分发用户产生的事件,比如按键、触摸屏操作或轨迹球...
客户端由Window、View、ViewRoot(连接View和Window系统的桥梁)以及WindowManager代理(与Service通信的中介)组成。 4. **窗口管理流程** - Activity启动时,通过`performLaunchActivity`创建PhoneWindow。 - `...
接着,Activity的根View会被添加到WindowManager中,此时,`WindowManagerImpl`会创建一个`ViewRoot`来管理这个根View。 **DecorView的创建** DecorView是Window的最顶层View,它是`PhoneWindow`的内部类,继承自`...
2. **ViewRoot.setView**: 此方法用于设置ViewRoot的视图层级,并最终通过`WindowManagerService.addWindow()`方法将新窗口添加到系统中。 3. **ViewRoot.performTraversals**: 该方法包含了视图层级结构的测量、...
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 ...
在XML布局文件中,将根视图(root view)的背景色设置为透明,如下所示: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" 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...
- **ViewRoot和DecorView**:DecorView是顶级窗口,ViewRoot是View与Window交互的桥梁。 - **MeasureSpec**:MeasureSpec是尺寸约束,用于测量View的大小。 - **自定义View**:了解如何根据需求定制View,包括...
在Android中,`Canvas`与Symbian中的`GC`相对应,但绘图机制有所不同。`View`是被动接受由`ViewRoot`提供的`canvas`,并在其上进行绘图。这个过程类似于Symbian中使用`SystemGc`进行绘图。`ViewRoot`还与`surface`...
本篇文章将详细阐述两种在Android中实现Activity全屏显示的方法。 ### 方法一:通过XML配置 在AndroidManifest.xml文件中,我们可以针对特定的Activity设置主题(Theme),从而实现全屏效果。有两种不同的选项: ...
2. **View与ViewRoot的关联** - 在`handleResumeActivity`时,`Activity`的`onResume`方法被调用。 - `WindowManager`将`DecorView`设置给`ViewRootImpl`。 - 此时`DecorView`加载到了`Window`中。 3. **View的...
在Android系统中,区域截屏是一项非常实用的功能,它允许用户截取屏幕的一部分而不是整个屏幕。这在处理长页面、隐私保护或者仅需分享部分信息时尤其方便。本篇文章将详细探讨Android区域截屏的实现原理、使用方法...
Android系统中的窗口(Window)分为多个层次,通常包括Activity、Dialog、PopupWindow等。当软键盘弹出时,它会调整当前窗口的布局,使输入框位于可见区域。对于悬浮窗(通常是使用PopupWindow或FloatingWindow实现...
ERROR/AndroidRuntime(888): android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRoot$W@44ef1b68 is not valid; is your activity running? 报错的意思大概就是说...
View contentRoot = findViewById(Window.ID_ANDROID_CONTENT); int contentTop = contentRoot.getTop(); int titleBarHeight = contentTop - statusBarHeight; ``` 此外,还可以使用其他方式获取屏幕和状态栏...
1. **悬浮窗权限**:在AndroidManifest.xml文件中,开发者需要添加悬浮窗权限,即`<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>`。从Android 6.0 (API level 23)开始,用户需要在运行...
Android中的悬浮窗口通常通过`WindowManager`服务来实现,它允许我们将视图添加到窗口层次结构中,使其显示在所有其他应用之上。关键代码如下: ```java WindowManager windowManager = (WindowManager) context....