- 浏览: 269821 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
liujunhao225:
jsoup 不是jsonp,请注意
使用JSONP 解析HTML网页。 -
ding2wife:
通过此文章终于知道他是干嘛的啦
android的armeabi和armeabi-v7a -
lkl:
真好的文章
android的armeabi和armeabi-v7a -
saturn54:
这真是好文章
android的armeabi和armeabi-v7a -
zhengfuzhou:
你好,咨询下,用google带的签名来签名,是哪个工具可以签名 ...
如何使Android应用程序获取系统权限
Android GWES之Android窗口管理
1基本构架原理
Android的窗口管理是C/S模式的。Android中的Window是表示Top Level等顶级窗口的概念。DecorView是Window的Top-Level View,这个View我称之为主View,DecorView会缺省的attach到Activity的主窗口中。主View被加入到 WindowManager中,WM使用WindowState与这个主View对应。
Activity建立一个主窗口后,在将主窗口添加到WindowManager时,首先要建立WindowManager代理对象,并打开一个会话(实 现IWindowSession AIDL接口),并维持该会话。Activity将通过该会话与WindowManager建立联系,这个Session是C/S体系的基 础,Client通过WindowSession将window加入到Window Manager中。
一个完整的窗口概念横跨了View,ViewRoot,WindowManager Service。Window,DecorView,View,IWindow ,ISession,WindowState之间的关系如下
Client端的Activity通过Session会话与WindowManager建立对话,而WindowManager则通过IWindow接口访问Client,将消息传递到Client端,通过消息分发渠道,将消息传递到处理函数OnXXX。
后面我们将通过Client,WM Service分别加以分析。
2 Client端
我一致认为在Android中Window的概念并不是个很重要的概念。他的Window类,只是在PhoneWindow和MidWindow中使用。 而PhoneWindow只是做了一个具体跟手机功能相关的公用事件的处理,所以在Android中PhoneWindow并不是一个抽象的纯正概念,而 是一个跟手机系统相关的一个特别窗口概念,例如按键的默认动作处理,按键音的发出等等。
2.1 View
在Activity中真正重要的概念是View,以下是Google官方对View的定义:
This class represents the basic building block for user interface components. A View occupies a rectangular area on the screen and is responsible for drawing and event handling. View is the base class for <em>widgets</em>, which are used to create interactive UI components (buttons, text fields, etc.). The {@link android.view.ViewGroup} subclass is the base class for <em>layouts</em>, which are invisible containers that hold other Views (or other ViewGroups) and define their layout properties.
我对View不做翻译,翻译成视图好像不太佳,View在Android中,View比视图具有广的外延。View包含了用户交互,包含了显示,视图在中 文中仅仅表示了静态的显示。对于View的理解应该从最容易的理解开始。我们使用过编辑器,在Android中这个编辑器就是一个View,这个编辑器需 要显示文字,需要接收用户的键盘输入和鼠标选择,但是一个屏幕上有多个编辑器,如何管理,如何切换焦点编辑器,这些都是需要管理的。
客户端的组成:(Window,View,ViewRoot,WindowManager Proxy)
在Activity在performLaunchActivity时,会使用Activity.attach()建立一个PhoneWindow主窗口。 这个主窗口的建立并不是一个重点。handleResumeActivity真正要启动一个Activity时候,将主窗口加入到 WindowManager,当然并不是将主窗口本身,而是将主窗口的DecorView加入到WindowManager中。
真正Window核心的抽象概念存在于View,ViewRoot,WindowManger中的WindowState。为了描述概念的方便性,我特别 提出主View这个概念,这个主View就是Top-Level View of the window. 主View与View想对,突出主View是attatch到主窗口上的。而一般的View则是存在于主View中的。主窗口这个概念,我讲的主窗口实际 上就是Android提到的Top Level Window。
我们所提到的概念:View,GroupView,DecorView,ViewRoot都是存在于Client端,只有WindowState这个概念存在于Window Manager Service端。
DecorView实际上是一个ViewGroup。在依存关系上来讲,对看个主窗口来讲,DecorView是Top-Level View.View并不是关注的重点,重要的是我们如何需要知道分发路径是建立在什么关系上的。View的成员变量mParent用来管理View上级关 系的。而ViewGroup顾名思义就是一组View的管理,于是在ViewGroup构建了焦点管理和子View节点数组。这样通过View的 mParent和ViewGroup的mChildren构建了Android中View直接的关系网。
2.2 Focus Path
所谓的Foucs Path就是我们的KeyEvent传递的路线。一般的我们的KeyEvent在主循环中主View通过View的焦点记录关系传递到焦点View上。例 如下图,View22是焦点,我们从最顶层的View通过mFcous的关系链找到最后所形成的路径就是Focus Path。
2.3 ViewRoot,Window Manager Proxy
ViewRoot 与Window Manager的核心是IWindowSession和IWindow。ViewRoot通过IWindowSession添加窗口到Window Manager。而IWindow这是Window Manager分发消息给Client ViewRoot的渠道。利用AIDL接口进行进程间通信。
ViewRoot实际是一个Handler,ViewRoot建立主View与WindowsManger通讯的桥梁。ViewRoot在本质上一个Handler。我们知道Handler的基本功能就是处理回调,发送消息。
Activity在使用getSystemService获取WindowManagerImpl ,建立了一个WindowManagerImpl实例,即Window Manager服务的代理:
wm=(WindowManagerImpl)context.getSystemService(Context.WINDOW_SERVICE);并调用wm.addview添加窗口到WMService中。
这 个过程在客户端建立了什么样的管理框架,并如何这个会话?在Window Manager Proxy中建立了View,Layout ,ViewRoot三者的对应关系表。构造一个ViewRoot就会打开一个session,并利用IWindowSession建立会话上下文。
4 Window Manager Service
本次对于Window Manager Service的研究仅限于FocusWindow,消息系统。其他的部分将在后面的专门章节讨论。
Window Manager管理的窗口是应用程序的Top-level窗口,我这里参照Window的概念叫主窗口。主窗口为什么要放在在Service这边来管理 呢?为什么不放在Client那边?主窗口放置在一起管理是为了计算Z-order序列,根据应用程序的状态来显隐应用程序的窗口。我想Android设 计者在考虑设计窗口系统的时候,一定首先考虑:
窗口z-order序的管理
活动窗口的计算,及其变化通知
窗口归属(属于哪个应用)
输入法管理
Window Service大体上实现了如下的功能:,
(1)Z-ordered的维护函数
(2)输入法管理
(3)AddWindow/RemoveWindow
(4)Layerout
(5)Token管理,AppToken
(6)活动窗口管理(FocusWindow)
(7)活动应用管理(FocusAPP)
(8)转场动画
(9)系统消息收集线程
(11)系统消息分发线程
在服务端的窗口对象叫做WindowState。在Service维护了一个mWindow数组,这个mWindow就是Window的Z-order序数组。mWindowMap用于记录<Client:Binder,WindowState对象>。
WindowState有一个叫做mClient成员变量来记录客户端IWindow实例,通过IWindow接口实例,Service可以访问客户端的信息,说以IWindow是Service连接View桥梁。
(1) FocusWindow活动窗口如何计算?
基本原理就是查找前景应用(FousActivity),并同Z-Order序中找出属于该FousActivity(AppToken)的主窗口,这个窗口就是计算出来的Focus Window。
(2)为什么要提出Token这个概念呢?
一 个应用程序要管理自己的窗口,那么如何来标识该窗口是属于某个Activity,Andoid设计者提出了AppToken这个概念。AppToken在 本质上的描述:<Token:IBinder,allWindows>,通过Token找到属于该Token的allWindows。使用 Token开始完成该应用程序的所有窗口的显示和隐藏。
(3)系统消息收集与处理
我们下面重点研究Service中的系统消息收集模式及其分发模式。Service使用KeyQ作为专门的消息队列。
KeyEvent
TouchEvent
TrackballEvent
系统有两个线程:
KeyQ线程,通过Navite函数readEvent轮询设备,将读取的结果放置在KeyQ队列中。
系统dispatcher 等待在KeyQ消息队列上,一旦从消息队列中获取到消息,就通过分发函数通过mClient传递到Client端。
文章来源:http://blog.csdn.net/maxleng/archive/2010/05/04/5557758.aspx
1基本构架原理
Android的窗口管理是C/S模式的。Android中的Window是表示Top Level等顶级窗口的概念。DecorView是Window的Top-Level View,这个View我称之为主View,DecorView会缺省的attach到Activity的主窗口中。主View被加入到 WindowManager中,WM使用WindowState与这个主View对应。
Activity建立一个主窗口后,在将主窗口添加到WindowManager时,首先要建立WindowManager代理对象,并打开一个会话(实 现IWindowSession AIDL接口),并维持该会话。Activity将通过该会话与WindowManager建立联系,这个Session是C/S体系的基 础,Client通过WindowSession将window加入到Window Manager中。
一个完整的窗口概念横跨了View,ViewRoot,WindowManager Service。Window,DecorView,View,IWindow ,ISession,WindowState之间的关系如下
Client端的Activity通过Session会话与WindowManager建立对话,而WindowManager则通过IWindow接口访问Client,将消息传递到Client端,通过消息分发渠道,将消息传递到处理函数OnXXX。
后面我们将通过Client,WM Service分别加以分析。
2 Client端
我一致认为在Android中Window的概念并不是个很重要的概念。他的Window类,只是在PhoneWindow和MidWindow中使用。 而PhoneWindow只是做了一个具体跟手机功能相关的公用事件的处理,所以在Android中PhoneWindow并不是一个抽象的纯正概念,而 是一个跟手机系统相关的一个特别窗口概念,例如按键的默认动作处理,按键音的发出等等。
2.1 View
在Activity中真正重要的概念是View,以下是Google官方对View的定义:
This class represents the basic building block for user interface components. A View occupies a rectangular area on the screen and is responsible for drawing and event handling. View is the base class for <em>widgets</em>, which are used to create interactive UI components (buttons, text fields, etc.). The {@link android.view.ViewGroup} subclass is the base class for <em>layouts</em>, which are invisible containers that hold other Views (or other ViewGroups) and define their layout properties.
我对View不做翻译,翻译成视图好像不太佳,View在Android中,View比视图具有广的外延。View包含了用户交互,包含了显示,视图在中 文中仅仅表示了静态的显示。对于View的理解应该从最容易的理解开始。我们使用过编辑器,在Android中这个编辑器就是一个View,这个编辑器需 要显示文字,需要接收用户的键盘输入和鼠标选择,但是一个屏幕上有多个编辑器,如何管理,如何切换焦点编辑器,这些都是需要管理的。
客户端的组成:(Window,View,ViewRoot,WindowManager Proxy)
在Activity在performLaunchActivity时,会使用Activity.attach()建立一个PhoneWindow主窗口。 这个主窗口的建立并不是一个重点。handleResumeActivity真正要启动一个Activity时候,将主窗口加入到 WindowManager,当然并不是将主窗口本身,而是将主窗口的DecorView加入到WindowManager中。
真正Window核心的抽象概念存在于View,ViewRoot,WindowManger中的WindowState。为了描述概念的方便性,我特别 提出主View这个概念,这个主View就是Top-Level View of the window. 主View与View想对,突出主View是attatch到主窗口上的。而一般的View则是存在于主View中的。主窗口这个概念,我讲的主窗口实际 上就是Android提到的Top Level Window。
我们所提到的概念:View,GroupView,DecorView,ViewRoot都是存在于Client端,只有WindowState这个概念存在于Window Manager Service端。
DecorView实际上是一个ViewGroup。在依存关系上来讲,对看个主窗口来讲,DecorView是Top-Level View.View并不是关注的重点,重要的是我们如何需要知道分发路径是建立在什么关系上的。View的成员变量mParent用来管理View上级关 系的。而ViewGroup顾名思义就是一组View的管理,于是在ViewGroup构建了焦点管理和子View节点数组。这样通过View的 mParent和ViewGroup的mChildren构建了Android中View直接的关系网。
2.2 Focus Path
所谓的Foucs Path就是我们的KeyEvent传递的路线。一般的我们的KeyEvent在主循环中主View通过View的焦点记录关系传递到焦点View上。例 如下图,View22是焦点,我们从最顶层的View通过mFcous的关系链找到最后所形成的路径就是Focus Path。
2.3 ViewRoot,Window Manager Proxy
ViewRoot 与Window Manager的核心是IWindowSession和IWindow。ViewRoot通过IWindowSession添加窗口到Window Manager。而IWindow这是Window Manager分发消息给Client ViewRoot的渠道。利用AIDL接口进行进程间通信。
ViewRoot实际是一个Handler,ViewRoot建立主View与WindowsManger通讯的桥梁。ViewRoot在本质上一个Handler。我们知道Handler的基本功能就是处理回调,发送消息。
Activity在使用getSystemService获取WindowManagerImpl ,建立了一个WindowManagerImpl实例,即Window Manager服务的代理:
wm=(WindowManagerImpl)context.getSystemService(Context.WINDOW_SERVICE);并调用wm.addview添加窗口到WMService中。
这 个过程在客户端建立了什么样的管理框架,并如何这个会话?在Window Manager Proxy中建立了View,Layout ,ViewRoot三者的对应关系表。构造一个ViewRoot就会打开一个session,并利用IWindowSession建立会话上下文。
4 Window Manager Service
本次对于Window Manager Service的研究仅限于FocusWindow,消息系统。其他的部分将在后面的专门章节讨论。
Window Manager管理的窗口是应用程序的Top-level窗口,我这里参照Window的概念叫主窗口。主窗口为什么要放在在Service这边来管理 呢?为什么不放在Client那边?主窗口放置在一起管理是为了计算Z-order序列,根据应用程序的状态来显隐应用程序的窗口。我想Android设 计者在考虑设计窗口系统的时候,一定首先考虑:
窗口z-order序的管理
活动窗口的计算,及其变化通知
窗口归属(属于哪个应用)
输入法管理
Window Service大体上实现了如下的功能:,
(1)Z-ordered的维护函数
(2)输入法管理
(3)AddWindow/RemoveWindow
(4)Layerout
(5)Token管理,AppToken
(6)活动窗口管理(FocusWindow)
(7)活动应用管理(FocusAPP)
(8)转场动画
(9)系统消息收集线程
(11)系统消息分发线程
在服务端的窗口对象叫做WindowState。在Service维护了一个mWindow数组,这个mWindow就是Window的Z-order序数组。mWindowMap用于记录<Client:Binder,WindowState对象>。
WindowState有一个叫做mClient成员变量来记录客户端IWindow实例,通过IWindow接口实例,Service可以访问客户端的信息,说以IWindow是Service连接View桥梁。
(1) FocusWindow活动窗口如何计算?
基本原理就是查找前景应用(FousActivity),并同Z-Order序中找出属于该FousActivity(AppToken)的主窗口,这个窗口就是计算出来的Focus Window。
(2)为什么要提出Token这个概念呢?
一 个应用程序要管理自己的窗口,那么如何来标识该窗口是属于某个Activity,Andoid设计者提出了AppToken这个概念。AppToken在 本质上的描述:<Token:IBinder,allWindows>,通过Token找到属于该Token的allWindows。使用 Token开始完成该应用程序的所有窗口的显示和隐藏。
(3)系统消息收集与处理
我们下面重点研究Service中的系统消息收集模式及其分发模式。Service使用KeyQ作为专门的消息队列。
KeyEvent
TouchEvent
TrackballEvent
系统有两个线程:
KeyQ线程,通过Navite函数readEvent轮询设备,将读取的结果放置在KeyQ队列中。
系统dispatcher 等待在KeyQ消息队列上,一旦从消息队列中获取到消息,就通过分发函数通过mClient传递到Client端。
文章来源:http://blog.csdn.net/maxleng/archive/2010/05/04/5557758.aspx
发表评论
-
SpannableString与SpannableStringBuilder
2016-05-26 14:46 695From :http://blog.csdn.net/ ... -
SSH 使用
2016-03-26 15:46 6661. OPENSSH,纯SSH。 2. tortoise ... -
AS问题解决系列3—iCCP: Not recognizing known sRGB profile
2016-01-20 09:59 944AS问题解决系列3—iCCP: Not recognizin ... -
RxJava的使用场景
2016-01-12 14:47 2089这篇blog主要是讨论一些RxJava比较常用的场景,大部分 ... -
超全面总结!深聊MATERIAL DESIGN引领的设计趋势
2016-01-12 10:44 688http://www.uisdc.com/material- ... -
Android之drawable state各个属性详解
2015-12-31 17:32 827Via ;http://blog.csdn.net/leas ... -
Gson toJson FromJson 异常
2015-12-28 17:49 1660当一个Bean里面 还有 WeakReference 或者 ... -
8 个最优秀的 Android Studio 插件
2015-12-04 14:40 0Android Studio是目前Google官方设计的用 ... -
Difference between make and build in Android Studio
2015-11-17 10:34 783Most of the time you should us ... -
android RelativeLayout 内容居中解决办法
2015-11-16 16:51 577使用Linearlayout本来利用父控件的gr ... -
ndroid Studio 打包及引用 aar
2015-11-12 17:58 12241、 简述 在比较大的 Android 项目的开 ... -
微信分销模式分析
2015-07-16 10:47 1171分销厂家 网站 演示网站 价格 ... -
2014年最受开发者好评的混合应用UI框架大比拼
2015-04-13 16:17 9382014年最受开发者好评的混合应用UI框架大比拼 ... -
多屏幕多分辨率的支持和一些概念
2015-02-02 14:08 1136多屏幕多分辨率的支 ... -
android 自定义Dialog背景透明及显示位置设置
2014-09-26 15:37 6534先贴一下显示效果图,仅作参考: ... -
JAVA 逻辑运算符的运算顺序的误解
2014-03-21 15:45 811先看下运算的代码: boolean test3=true||t ... -
Android编码规范
2014-03-21 12:51 750一、Android编码规范 ... -
android的armeabi和armeabi-v7a
2014-03-15 19:07 62627在ANE中如果SDK调用了so库,则需要把so库放到ANE ... -
Android 核心分析(13) -----Android GWES之Android窗口管理
2014-03-11 18:19 884Android GWES之And ... -
程序员最艰巨的十大任务
2013-12-12 10:47 730本文的作者: Craig Buckler 程序员最艰 ...
相关推荐
Android窗口管理遵循C/S(客户端/服务器)模式。Window在Android中代表顶级窗口,而DecorView作为Window的顶级视图,是Activity的主要视图组件,它会自动附加到Activity的主窗口上。当Activity创建其主窗口并将其...
核心分析之十三 ----- Android GWES之Android窗口管理 核心分析之十四 ----- Android GWES之输入系统 核心分析之十五 ----- Android 输入系统之输入路径详解 核心分析之十六 ----- Android 电话系统-概述篇 核心...
#### 十三、AndroidGWES之Android窗口管理 对GWES中的窗口管理进行更详细的解析,介绍其实现细节。 #### 十四、AndroidGWES之输入系统 分析GWES中的输入系统,包括输入事件的捕获、分发机制等。 #### 十五、...
#### AndroidGWES之Android窗口管理 进一步深入窗口管理的具体实现细节,包括如何创建窗口、设置属性、更新布局等。 #### AndroidGWES之输入系统 输入系统处理用户的输入事件,如触摸、按键等,确保应用程序能够...
AndroidGWES之Android窗口管理** 窗口管理是GWES的一个重要方面,它涉及到窗口的创建、销毁、布局调整和焦点处理。WindowManagerService是窗口管理的核心组件,负责所有窗口的生命周期管理。 ### **13. Android...
#### 十三、AndroidGWES之Android窗口管理 这部分进一步阐述了窗口管理的具体实现细节,包括如何处理窗口的创建、销毁、焦点变化等操作。通过学习这些内容,开发者可以更好地控制应用界面的行为。 #### 十四、...
Android 核心分析(13) -----Android GWES 之 Android 窗口管理............................... 50 Android 核心分析(14)------ Android GWES 之输入系统..........................................57 Android 核心...
Android核心分析(13)-----AndroidGWES之Android窗口管理...............................50 Android核心分析(14)------AndroidGWES之输入系统..........................................57 Android核心分析(15)-...
Android GWES(Graph Window Event System)是Android操作系统中窗口事件处理的核心组件,它涉及到了界面交互、消息传递和窗口管理等多个关键领域。虽然GWES这个术语来源于Microsoft的窗口系统,但在Android中,它...
#### 十三、AndroidGWES之Android窗口管理 - **窗口管理器**:详细分析了WindowManagerService组件的功能,它是如何协调窗口绘制和布局的。 - **布局策略**:解释了窗口布局的策略,以及如何根据屏幕尺寸和方向自动...
Android 核心分析 技术专题之十三--Android GWES之Android窗口管理
Android GWES,即Android图形窗口环境系统(Graphic Window Environment System),是Android系统中用于管理和控制用户界面(UI)的关键组件之一。它主要负责处理用户交互事件(Event Handling)、绘制界面(Graphics ...
Android的GWES(图形、窗口和事件子系统)负责管理Android设备的窗口显示和输入系统。GWES包括基本窗口管理、消息系统和输入系统等多个子系统,它们共同协作,确保应用界面能够正确响应用户的输入,并在屏幕上绘制...
4.窗口管理:Android窗口管理的基本架构原理、GWES之基本原理篇、GWES之消息系统。 5.输入系统:Android输入系统之输入路径详解。 6.电话系统:Android电话系统概述篇、rilD、RIL-Java、GSMCallTacker。 7.应用...
#### 四、Android窗口管理机制 在Android中,窗口的管理主要由`ActivityManagerService`和`WindowManagerService`协同完成。当应用程序启动或切换活动时,`ActivityManagerService`负责协调和控制应用生命周期,而`...
13. Android GWES的窗口管理:进一步探讨了Activity、Window和View三者的关系,以及如何实现窗口的显示和交互。 14. 输入系统:阐述了Android如何接收和处理各种输入事件,包括触摸屏、键盘和手写输入。 15. 输入...
**Android核心分析(12):** 阐述了GWES中窗口管理的基本架构原理,包括窗口树的概念、窗口的创建与销毁过程。 **Android核心分析(13):** 进一步探讨了GWES中具体的窗口管理机制,如窗口的绘制流程、布局算法等...
- **GWES基本原理**:Graphical Window Event System(GWES)是Android图形用户界面的核心组件之一,负责处理触摸事件、绘制窗口等内容。 - **GWES消息系统**:深入了解GWES如何处理和分发消息,对于优化用户体验非常...
3. 系统服务分析:Android系统服务框架(GWES)包括消息系统、窗口管理、输入系统等核心组件。例如,Android的窗口管理器(WindowManagerService)负责管理所有应用程序窗口的布局和显示,而输入系统...