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。所以其实在客户端的核心概念只有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接口下发事件。

时间: 2024-10-25 03:59:49

Android窗口管理(2)——消息传递的相关文章

Android窗口管理(1)——窗口基本架构

本文给大家介绍以下Android窗口的基本架构,平时我们在编码时打交道最多的就是各种View以及各种Layout.但系统窗口究竟是以何种形式将这些组件组织在一起,在View和Layout的上层又是通过哪些组件以什么样的方式来管理的?首先来看一下Window的基本结构: 从图中可以看到,除了ViewGroup和View这些非常熟悉的组件了,在其之上还有ViewRoot.DecorView.PhoneWindow三个'管家'来管理这些小弟.那么它们究竟分别有什么作用呢? PhoneWindow 要想

android窗口管理框架简介

窗口管理是android的一个核心内容.它管理着窗口的创建和销毁,布局和大小,焦点的控制等等. 窗口可以分为两类: 一种是应用窗口,即由具体应用创建的窗口,其实其中还可以细分出父窗口和子窗口.窗口一般都会对应一个activity. 一种是系统窗口,如状态栏,这类窗口由系统直接通过windowManager来创建,和activity无关. 在这里,窗口的概念其实可以说由三部分构成,一部分是用来描述窗口信息的,由WindowState对象表示.一个WindowState对象对应一个窗口,它拥有绘制窗

Android权限管理之Permission权限机制及使用详解_Android

前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过程中讨论比较多的一个知识点Android 6.0 权限适配问题来进行学习,不过我不想直接进入这个主题,所以选择先去了解一下Android的Permission权限机制及使用 Android权限机制: 权限是一种安全机制.Android权限主要用于限制应用程序内部某些具有限制性特性的功能使用以及应用程序之间的组

毕设-求Android教学管理系统资源

问题描述 求Android教学管理系统资源 基于Android平台的教学管理系统的设计与实现 要求两个客户教师和学生,教师可以发布作业和通知,录入作业成绩:学生可以收查看作业通知和成绩 非常感谢! 解决方案 我有一个完整的,要的话关注我给你 解决方案二: 教学管理系统-需求分析教学管理系统-数据库设计教学管理系统-会话Bean 解决方案三: 你是要一个完整的产品,还是要思路 解决方案四: 可以使用一般的及时通APP完成上述步骤,如果你要有专一化的平台,你可能需要很多东西,首先需从数据库说起,建一

Android电源管理相关应用技巧分享

对于刚刚接触Android操作系统的朋友来说,他们对这一开源的手机操作系统所带来的功能深深的吸引着.我们在这篇文章中就通过对Android电源管理的相关概念的解读,来对这一系统进行深入的了解. 接下来我们从Java应用层面, Android framework层面, Linux内核层面分别进行详细的讨论: Android电源管理应用层的使用: Android提供了现成android.os.PowerManager类,该类用于控制设备的电源状态的切换. 该类对外有三个接口函数: 1.void go

android内存管理

在任何软件开发环境中,RAM都是非常宝贵资源.在移动操作系统里,由于物理内存的限制,它会变得更加的宝贵.虽然Android的Dalvik虚拟机会常规的执行垃圾回收,但是开发人员仍然不能忽略什么时候.在哪里申请和释放内存资源. 为了能够使垃圾回收器从应用里正常的回收内存资源,开发人员需要避免产生内存泄露,注意在合适的时候释放引用Reference(内存泄露常常由于保持着全局变量的引用).对于大多数应用,Dalvik垃圾收集器会处理大部分的回收工作:系统会在对应脱离活动线程的作用域后回收你申请的内存

MDI窗口管理的动态窗口排列?

问题描述 MDI窗口管理的动态窗口排列? MDI窗口管理的动态窗口排列?怎么将窗口排列成层叠.平铺和分割这些效果? 解决方案 MDI Winform中窗口屏幕.级联等排列的实现

Awesome平铺式窗口管理编译与安装

这里首先需要解释一下窗口管理器(Windows Manager)和桌面环境(http://www.aliyun.com/zixun/aggregation/16493.html">Desktop Environment)的概念.窗口管理器负责绘制窗口的边框,处理窗口运行比如移动.最小化之类的行为.而桌面环境则是窗口管理器的超集,它使用窗口管理器及其其他软件提供一个完整的工作环境.比如说,gnome就是一个桌面环境,默认使用metacity作为窗口管理器. 那么什么是平铺式窗口管理器?简单来

Android Permissions管理之用户拒绝授权

Android Permissions管理之用户拒绝授权,在Marshmallow之前的安卓版本,应用的权限只需要注册一下,应用就会获取到,在Marshmallow之后,为了安全,全新的权限模型出现,每次使用对应权限的时候,都会弹出 是否让应用获取权限的弹框.如果,用户点击是,给应用授权,那么一切都这样美好的进行就行,如果点击否,拒绝应用的授权,那么一切不美丽的事情就这样开始了,除非用户去设置里面设置给应用权限,那样应用才会正常进行,但是,很遗憾,大部分用户都不会设置这样操作的,繁琐,麻烦.那么