本文内容参考: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。所以其实在客户端的核心概念只有ViewRootDecorView以及ViewGroup。其中后面两者主要还是View的概念,真正完成与WindowManager进行通信的还是ViewRoot这个家伙。

ViewRoot

ViewRoot的真正实现类是ViewRootImplViewRoot通过与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)——消息传递相关推荐

  1. Android窗口管理服务WindowManagerService计算窗口Z轴位置的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8570428 通过前面几篇文章的学习,我们知道了 ...

  2. Android窗口管理服务WindowManagerService切换Activity窗口(App Transition)的过程分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8596449 在Android系统中,同一时刻只 ...

  3. Android窗口管理服务WindowManagerService对壁纸窗口(Wallpaper Window)的管理分析

    在Android系统中,壁纸窗口和输入法窗口一样,都是一种特殊类型的窗口,而且它们都是喜欢和一个普通的Activity窗口缠绵在一起.大家可以充分地想象这样的一个3W场景:输入法窗口在上面,壁纸窗口在 ...

  4. [转][android深入学习]android窗口管理机制

    在学习 WindowManager 接口的时候,了解到这个接口很重要,因为它可以直接与Window Manager(窗口管理器)进行交互,那这个 Window Manager 究竟是怎么一回事呢? 通 ...

  5. android窗口管理机制

    在学习 WindowManager 接口的时候,了解到这个接口很重要,因为它可以直接与Window Manager(窗口管理器)进行交互,那这个 Window Manager 究竟是怎么一回事呢? 通 ...

  6. Android窗口管理服务WindowManagerService计算Activity窗口大小的过程分析

    在Android系统中,Activity窗口的大小是由WindowManagerService服务来计算的.WindowManagerService服务会根据屏幕及其装饰区的大小来决定Activity ...

  7. Android窗口管理服务WindowManagerService的简要介绍和学习计划

    在前一个系列文章中,我们从个体的角度来分析了Android应用程序窗口的实现框架.事实上,如果我们从整体的角度来看,Android应用程序窗口的实现要更复杂,因为它们的类型和作用不同,且会相互影响.在 ...

  8. Android 核心分析之十二Android GEWS窗口管理之基本架构原理

    Android GWES之窗口管理之基本构架原理 Android的窗口管理是C/S模式的.Android中的Window是表示Top Level等顶级窗口的概念.DecorView是Window的To ...

  9. [转]Android 之 Window、WindowManager 与窗口管理

    这篇是对前两天研究的悬浮窗的内容的一个小小的资料整理吧.首先是转载一篇介绍Android窗口的内容,觉得写得不错:http://blog.csdn.net/xieqibao/article/detai ...

最新文章

  1. linux遭入侵挖矿进程被隐藏案例分析
  2. HDU - 4416 Good Article Good sentence(广义后缀自动机/后缀自动机)
  3. 移位运算符:,,总结
  4. 面试官:Netty的线程模型可不是Reactor这么简单
  5. 利用 jQuery 克隆 Object
  6. linux 文件权限 rwt,Linux下修改文件权限(所有权)
  7. phpPgAdmin-5.1安装配置
  8. Echarts地图的基本使用方法
  9. 使用python调用openmpi编译的MPI 动态库报错:mca_base_component_repository_open: unable to open mca_patcher_overwri
  10. C 语言之父,UNIX 系统之父 Dennis Ritchie (丹尼斯 里奇)于 10 月 9 日去世,享年 70 岁
  11. python helper函数_用Python中的helper函数对ABC进行单元测试
  12. 黑客攻击_我如何开始黑客攻击
  13. 如何把大写金额变为小写数字_excel怎么把小写数字转换成人民币大写?
  14. Android热修复-Tinker简析
  15. line-rate 线速
  16. 2022华中杯数学建模思路
  17. Spyder输入中文后光标消失
  18. 计算机组成原理片级逻辑图,计算机组成原理试题(五)
  19. paper reading——《Improving Person Re-identification by Attribute and Identity Learning》
  20. html时间日期 年月日时分秒,年月日时分秒的即时显示

热门文章

  1. eclipse14配置tomcat Server Locations
  2. oracle查询结果展示,ORACLE构造查询日期展示结果
  3. android studio安装部署及sdk下载_「从零开始Python爬虫」1.7.3 APPium的安装
  4. mc有什么红石机器人_我的世界:mc玩家与非mc玩家眼中的世界,测一测你mc中毒有多深...
  5. mac虚拟机linux性能测试,Veertu 1.0.4 – Mac上最轻便的虚拟机,可以运行Windows/Linux。...
  6. 如何检查数组是否有重复值
  7. 个人计算机预防勒索病毒,Windows10如何开启预防勒索病毒功能|电脑安全开启防御勒索软件的方法...
  8. canvas 封装一个自己的 icon 库
  9. Android让控件位于底部
  10. 小学教师计算机应用培训通讯稿,暑期培训通讯稿