Android窗口管理(2)——消息传递
本文内容参考:Android 核心分析(13) —–Android GWES之Android窗口管理
上一篇文章主要讲述了窗口的基本结构,那么在这样的结构下,系统如何管理窗口,如何下发事件,如何获取窗口状态?这篇博客将对这部分的内容进行介绍。
Android在窗口管理上采用了最为经典的C/S模式,Client端是各个Activity中的window,而Service端就是系统持有的窗口管理器Window Manager。
总体结构
Window
是顶级的窗口概念,而Activity
中的DecorView
则是窗口中的顶级View
,创建Activity
时,DecorView
会attach到Activity
的窗口中,同时也被加入到WindowManager
中,WindowManager
使用WindowState
与该View
相对应。
两者之间通过建立session会话进行通信,而这里的session采用的还是Android中最重要的IPC方式——AIDL。Activity
在建立窗口后需要将该窗口注册到WindowManager
中,这个过程涉及到在Activity
本地创建一个WindowManager
的代理,Activity
通过这个代理和远程WindowManager
进行会话,会话的通道是IWindowSession
,本质上就是一个AIDL通信过程。
会话是双向的,为了将消息发送给对应的Window
,WindowManager
通过IWindow
接口将对应的消息发送给Window
端对应的处理函数。
Client端——Activity
首先来看一下Client
端,通过我的上一篇博客Android窗口管理(1)——窗口基本架构我们知道了Activity
端的窗口结构,并且知道了Window
,PhoneWindow
都不是很重要的概念,实际真正干事的还是ViewRoot
。
Activity
在创建的时候会调用onAttach()
创建PhoneWindow
这个类,并在handleResumeActivity
时将窗口加入到WindowManager
中,不过加入的实际上并不是窗口,而是DecorView
。所以其实在客户端的核心概念只有ViewRoot
,DecorView
以及ViewGroup
。其中后面两者主要还是View
的概念,真正完成与WindowManager
进行通信的还是ViewRoot
这个家伙。
ViewRoot
ViewRoot
的真正实现类是ViewRootImpl
。ViewRoot
通过与WindowManager
进行通信完成addView
以及消息下发。
ViewRoot
通过IWindowSession
将窗口加入到WindowManager
中。
WindowManager
通过IWindow
接口下发事件到Activity
。
所以ViewRoot
其实本质上是一个Handler
,用于接收消息并处理消息。
Activity
利用getSystemService
来获取WindowManagerImpl
实例,而这个实例实际上就是WindowManager
在客户端本地的代理:
wm=(WindowManagerImpl)context.getSystemService(Context.WINDOW_SERVICE);
之后再调用addView
接口通过WindowManagerImpl
将窗口添加到WindowManager
中。在addView
的过程中,WindowManagerImpl
会建立起View
,Layout
,ViewRoot
之间的对应关系,然后利用IWindowSession
传递给WindowManager
。
Server端——WindowManager
WindowManager
是服务端管理窗口的组件,它管理的是各个应用的顶级窗口,也即DecorView
。将所有的窗口归置到一个统一的系统服务WindowManagerService
管理是Android系统的设计思想,这样的机制并不难理解,系统总要有一个总管各个窗口的管家嘛,总不能任其自生自灭。WindowManagerService
的主要工作包括:
Window Service大体上实现了如下的功能:,
(1)Z-ordered的维护函数
(2)输入法管理
(3)AddWindow/RemoveWindow
(4)Layerout
(5)Token管理,AppToken
(6)活动窗口管理(FocusWindow)
(7)活动应用管理(FocusAPP)
(8)转场动画
(9)系统消息收集线程
(10)系统消息分发线程
在服务端窗口对象叫作WindowState
,Server端维护一个mWindow
,其实就是一个按Z-order排序的窗口数组。mWindowMap
用于记录<Client:Binder,WindowState对象>
。
WindowState
通过本地的client
实例维护IWindow
实例,同时利用该实例访问窗口。
FocusWindow活动窗口如何计算
原理其实很简单,首先找到前台应用,然后根据mWindow
找到Z-order顺序中第一位次的窗口,该窗口就是活动窗口。
为什么要提出Token这个概念
Token在本质上就是一个标示符,应用程序使用改标示符来找到该应用的窗口。AppToken:<Token:IBinder,allWindows>
。通过Token就可以管理该应用的所有窗口。
WindowManager
消息与分发
下面再来说一下WindowManager
的系统消息收集与分发过程。WindowManagerService
在内部维护了一个KeyQ
的消息队列,同时还有两个线程:
1.InputDeviceReader
2.InputDispatcherThread
InputDeviceReader
使用Native函数readEvent
从driver中读取RawEvent
并放到KeyQ
队列中。
InputDispatherThread
负责从KeyQ
队列中读取事件,并在WindowManager
找到对应的窗口,利用该窗口的IWindow
接口下发事件。
Android窗口管理(2)——消息传递相关推荐
- Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8570428 通过前面几篇文章的学习,我们知道了 ...
- Android窗口管理服务WindowManagerService切换Activity窗口(App Transition)的过程分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8596449 在Android系统中,同一时刻只 ...
- Android窗口管理服务WindowManagerService对壁纸窗口(Wallpaper Window)的管理分析
在Android系统中,壁纸窗口和输入法窗口一样,都是一种特殊类型的窗口,而且它们都是喜欢和一个普通的Activity窗口缠绵在一起.大家可以充分地想象这样的一个3W场景:输入法窗口在上面,壁纸窗口在 ...
- [转][android深入学习]android窗口管理机制
在学习 WindowManager 接口的时候,了解到这个接口很重要,因为它可以直接与Window Manager(窗口管理器)进行交互,那这个 Window Manager 究竟是怎么一回事呢? 通 ...
- android窗口管理机制
在学习 WindowManager 接口的时候,了解到这个接口很重要,因为它可以直接与Window Manager(窗口管理器)进行交互,那这个 Window Manager 究竟是怎么一回事呢? 通 ...
- Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析
在Android系统中,Activity窗口的大小是由WindowManagerService服务来计算的.WindowManagerService服务会根据屏幕及其装饰区的大小来决定Activity ...
- Android窗口管理服务WindowManagerService的简要介绍和学习计划
在前一个系列文章中,我们从个体的角度来分析了Android应用程序窗口的实现框架.事实上,如果我们从整体的角度来看,Android应用程序窗口的实现要更复杂,因为它们的类型和作用不同,且会相互影响.在 ...
- Android 核心分析之十二Android GEWS窗口管理之基本架构原理
Android GWES之窗口管理之基本构架原理 Android的窗口管理是C/S模式的.Android中的Window是表示Top Level等顶级窗口的概念.DecorView是Window的To ...
- [转]Android 之 Window、WindowManager 与窗口管理
这篇是对前两天研究的悬浮窗的内容的一个小小的资料整理吧.首先是转载一篇介绍Android窗口的内容,觉得写得不错:http://blog.csdn.net/xieqibao/article/detai ...
最新文章
- linux遭入侵挖矿进程被隐藏案例分析
- HDU - 4416 Good Article Good sentence(广义后缀自动机/后缀自动机)
- 移位运算符:,,总结
- 面试官:Netty的线程模型可不是Reactor这么简单
- 利用 jQuery 克隆 Object
- linux 文件权限 rwt,Linux下修改文件权限(所有权)
- phpPgAdmin-5.1安装配置
- Echarts地图的基本使用方法
- 使用python调用openmpi编译的MPI 动态库报错:mca_base_component_repository_open: unable to open mca_patcher_overwri
- C 语言之父,UNIX 系统之父 Dennis Ritchie (丹尼斯 里奇)于 10 月 9 日去世,享年 70 岁
- python helper函数_用Python中的helper函数对ABC进行单元测试
- 黑客攻击_我如何开始黑客攻击
- 如何把大写金额变为小写数字_excel怎么把小写数字转换成人民币大写?
- Android热修复-Tinker简析
- line-rate 线速
- 2022华中杯数学建模思路
- Spyder输入中文后光标消失
- 计算机组成原理片级逻辑图,计算机组成原理试题(五)
- paper reading——《Improving Person Re-identification by Attribute and Identity Learning》
- html时间日期 年月日时分秒,年月日时分秒的即时显示
热门文章
- eclipse14配置tomcat Server Locations
- oracle查询结果展示,ORACLE构造查询日期展示结果
- android studio安装部署及sdk下载_「从零开始Python爬虫」1.7.3 APPium的安装
- mc有什么红石机器人_我的世界:mc玩家与非mc玩家眼中的世界,测一测你mc中毒有多深...
- mac虚拟机linux性能测试,Veertu 1.0.4 – Mac上最轻便的虚拟机,可以运行Windows/Linux。...
- 如何检查数组是否有重复值
- 个人计算机预防勒索病毒,Windows10如何开启预防勒索病毒功能|电脑安全开启防御勒索软件的方法...
- canvas 封装一个自己的 icon 库
- Android让控件位于底部
- 小学教师计算机应用培训通讯稿,暑期培训通讯稿