android中的window总结

本文深入解析了Android系统中Window的概念及其实现原理,探讨了Window、View与WindowManager之间的关系,以及WindowManager如何通过LayoutParams控制不同类型的Window。

window   表示一个窗口,和android组件activity一样,其本身是不可见的,只是一个窗口的概念,代码上表现为是一个抽象类,实际中对window的操作都是通过windowManager来完成,window的实现是通过windowManagerService来实现。而windowManager和windowManagerService之间的交互是一个IPC过程,即进程间通信(可参考:http://www.cnblogs.com/CheeseZH/p/5264465.html)。window的唯一实现对象是PhoneWindow。


view  是所有控件的父类,view是window具体化的实体存在。在android中,每一个window对应着一个view和一个viewRootImpl,其中,viewRootImpl为view和window的交互提供了桥梁。


windowManager实现了viewManager接口,并重写了addview、removeview、updateviewlayout三个方法,可以看出windowManager对window的操作实际上是对view的操作,这也体现了view和window间的关系:window实际上是view的直接管理者。


view的存在必须依附于window上,android中所有的视图包括activity、dialog、toast、等都是view的体现,都依附于window。


windowManager的LayoutParams几个参数:

----------------------Flags: 控制window的显示特性:

a.FLAG_NOT_FOCUSABLE: window不获取焦点,也不接受各种输入事件,所有事件直接传递到下层有焦点的window。

b.FLAG_NOT_TOUCH_MODAL:当前window区域以外的单击事件传递给底层的window。区域以内的单击事件则自己消化处理

(该标记相当重要,一般都要开启此标记,否则window将无法收到单击事件)

c.FLAG_SHOW_WHEN_LOCKED:让window显示到锁屏界面。

----------------------Type: 表示window的类型。


window的类型有三类:应用window、子window和系统window。

1.应用类window对应着一个activity。

2.子window附属于一个服务window,不能单独存在(比如dialog)。

3.系统window是需要声明权限在能创建的widow(比如toast)。

widow是分层的层级大的会覆盖在层级小的window上。

在三类window中,应用window的层级范围是1-99,子window的层级范围是1000-1999,系统window的层级范围是2000-2999。

### AndroidWindow和Surface的区别 在Android系统中,`Window` 和 `Surface` 是两个重要的概念,它们在UI渲染和显示机制中扮演着不同的角色。以下是它们的主要区别和功能: #### 1. **定义与作用** - **Window** 在Android中,`Window` 是一个抽象的概念,表示一个窗口对象。它是一个矩形区域,可以包含多个视图(View)并负责管理这些视图的布局和事件处理[^2]。每个`Activity` 都会创建一个`Window` 实例,并通过`WindowManager` 来管理。 - **Surface** `Surface` 是一个底层的图形缓冲区,用于绘制图形内容。它可以看作是屏幕上的一个独立绘图层,通常用于需要高性能渲染的场景,例如视频播放或游戏渲染[^1]。 #### 2. **实现方式** - **Window** `Window` 的实现依赖于`PhoneWindow` 类,它是`Activity` 中默认使用的窗口实现类。通过`WindowManager`,开发者可以向系统请求创建新的窗口实例,并指定其属性(如位置、大小、透明度等)。 - **Surface** `Surface` 是由`SurfaceFlinger` 管理的,`SurfaceFlinger` 是Android系统中的合成器服务,负责将多个`Surface` 合成为最终的屏幕显示内容[^3]。`SurfaceView` 和`TextureView` 都使用了`Surface` 来进行渲染,但它们的实现方式有所不同。 #### 3. **渲染机制** - **Window** `Window` 的渲染主要依赖于`View` 层次结构。所有的`View` 都会被绘制到同一个`Surface` 上,然后由`SurfaceFlinger` 进行合成。这种方式适合普通的UI界面渲染。 - **Surface** `Surface` 提供了一个独立的缓冲区,可以直接绕过`View` 层次结构进行渲染。这种方式适合需要高性能和独立渲染的场景,例如视频解码后的帧数据可以直接写入`Surface`[^1]。 #### 4. **性能与开销** - **Window** 由于`Window` 的渲染需要经过`View` 层次结构,因此在复杂的UI场景下可能会有一定的性能开销。然而,对于大多数应用来说,这种方式已经足够高效。 - **Surface** `Surface` 提供了更高的灵活性和性能,因为它允许直接访问底层的图形缓冲区。然而,这也意味着开发者需要承担更多的责任来管理渲染过程,可能会增加开发复杂度[^2]。 #### 5. **使用场景** - **Window** 适用于普通的UI界面开发,例如按钮、文本框、列表等。所有标准的`View` 组件都运行在`Window` 上。 - **Surface** 适用于需要高性能渲染的场景,例如视频播放、游戏开发、实时图像处理等。`SurfaceView` 和`TextureView` 是常见的使用`Surface` 的组件。 ```java // 示例:创建一个自定义的Window if (mWindow == null) { mWindow = new MyWindow(this); mLayout.type = mWindowType; mLayout.gravity = Gravity.LEFT | Gravity.TOP; mSession.addWithoutInputChannel(mWindow, mWindow.mSeq, mLayout, mVisible ? VISIBLE : GONE, mContentInsets); } ``` ### 总结 `Window` 和`Surface` 在Android系统中分别负责不同的任务。`Window` 主要用于管理UI界面的布局和事件处理,而`Surface` 则提供了高性能的渲染能力。开发者可以根据具体需求选择合适的工具来实现目标功能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值