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

通过查找资料,我知道了 Window Manager 其实是一个 service(服务)。它是全局的,系统中唯一的,是独立于android应用程序的,所有android应用程序公用的 一个单独的C++服务。(这个“单独的C++服务”的说法,建议先看看:android概念空间及seviceManager 的介绍)

1. 基本架构原理

要了解这个服务,我们首先要对android的基本架构原理有个了解。

Android 是基于 C/S 模式的。在我们的根深蒂固的想法中,C/S架构就是 客户端和服务端直接通过Binder交互数据,打开Binder写入数据,通过Binder读取数据,通讯就可以完成了。如下图:

然而,在 Android 的概念中,Binder 是一个很低层的概念,是 Linux 内核提供的 Binder 通讯机制。上面一层根本都看不到 Binder ,而是 Activity 跟一个 Service 的对象直接通过方法调用,获取服务。

这个就是Android提供给我们的外特性:在Android中,要完成某个操作,所需要做的就是请求某个有能力的服务对象去完成动作,而无需知道这个通讯是怎样工作的,以及服务在哪里。所以 Andoid 的 IPC(进程间通信)在本质上属于对象请求代理架构(对象请求代理架构:CORBA )。就是说它不仅解决了进程间的通信问题,还是一个架构,提出了一种设计理念。

既然android的IPC 的本质是CORBA,那么我们就来分析一下CORBA。

CORBA

由OMG组织制订的一种标准的面向对象应用程序体系规范,或者说 CORBA体系结构是对象管理组织(OMG)为解决分布式处理环境(DCE)中,硬件和软件系统的互连而提出的一种解决方案。

CORBA定议了一系列API,通信协议,和 物件/服务信息模型 用于使得异质应用程序能够互相操作,这些应用程序用不同的程序语言编写,运行在不同的平台上。CORBA因此为定义明确的物件提供了平台和位置的透明性,这些物件是分布式计算平台的基础。

COBRA标准主要分为3个层次:对象请求代理、公共对象服务和公共设施。最底层最核心就是ORB(对象请求代理)。

ORB规定了分布对象的定义(接口)和语言映射,实现对象间的通讯和互操作,是分布对象系统中的"软总线";在ORB之上定义了很多公共服务,可以提供诸如并发服务、名字服务、事务(交易)服务、安全服务等各种各样的服务;最上层的公共设施则定义了组件框架,提供可直接为业务对象使用的服务,规定业务对象有效协作所需的协定规则

【ORB】

ORB是一个在对象间建立客户/服务器联系的中件。使用ORB,客户可以调用服务器的对象或对象中的应用,被调用的对象不要求在同一台机器上。由ORB负责进行通信,同时ORB也会在调用对象完成后返回结果。客户对象完全可以不关心服务器对象的位置,实现它所采用的具体技术和工作的硬件平台,甚至不必关心服务器对象的与服务无关的接口信息,这就大大简化了客户程序的工作。既然能够这么方便,那ORB就需要提供在不同机器间应用程序间的通信,数据转换,并提供多对象系统的无缝连接。

CORBA 的本质以图的形式展现就是如下:

在服务端,多了个代理器:

分析了CORBA的大体理论架构,下面我们来看一下Android的对象代理结构

在结构图中,我们可以较为清楚的把握Android的IPC包含了如下的概念:

  • 设备上下文什(ContextObject)

设备上下文包含关于客服端,环境或者请求中没有作为参数传递个操作的上下文信息,应用程序开发者用ContextObject接口上定义的操作来创建和操作上下文。

  • Android代理:这个是指服务端在客户端的代理对象
  • Binder :Linux内核提供的Binder通讯机制(底层)
  • AIDL : Android 中的远程接口

Android的外特性空间是不需要知道服务在那里,只要通过代理对象完成请求。

2.窗口管理概述

了解了Android 的基本架构原理,现在我们回到窗口管理这一块。

Android 的窗口管理是基于 C/S 模式的,客户端就是应用程序,服务端 就是 Window Manager服务。如下图:

Activity 建立一个主窗口之后,在将主窗口添加到 Window Manager 时,首先要建立 Window Manager的代理对象,并打开一个Session(session:会话;实现 IWindowSession AIDL 接口),并维持该会话(Activity 将通过该会话与 Window Manager 建立联系,这个Session 是C/S 体系的基础)。Client 通过这个Session 将 window 加入到 Window Manager 中。

一个完整的窗口概念包含了 View,ViewRoot,Window Manager Service,Window,Decor View,IWindow,ISession,WindowState。他们之间的关系如下:

Client 端的 Activity 通过 IWindowSession 会话与Window Manager Service 建立对话,而 Window Manager Service 通过 IWindow 接口访问 Client,将消息传递到Client 端,在通过消息分发渠道,将消息传递到具体的消息处理函数。(用户输入等操作最先是到 窗口管理服务,由窗口管理服务发给活动窗口,再一步步传递到焦点)。

3. Client 端

   客户端组成:

Window,View,ViewRoot,Window Manager Proxy

View:

View 在 Android 中包含了 交互 和显示。

在Activity 在 performLaunchActivity 时,会使用Activity.attach() 建立一个 PhoneWindow 主窗口。这个主窗口的建立并不是一个重点。handleResumeActivity 真正要启动一个Activity 的时候,会将主窗口加入到 Window Manager,当然并不是主窗口本身,而是指的主窗口的 DecorView 。

DecorView :实际上是一个ViewGroup ,在依存关系上来讲,对看这主窗口来讲,DecorView 是 Top-Level View 。如下图:

View 的成员变量 mParent 用来管理 View 上级关系。而 ViewGroup 里构建了焦点管理和子 View 节点数组。这样通过 View 的mParent 和 ViewGroup的 mChildren 构建了 Android 中View直接的关系网。如下图:

Focus Path

所谓的 Foucs Path 就是我们的KeyEvent 传递的路线。一般的我们的KeyEvent 在主循环中,主View 通过View的焦点记录关系传递到焦点 View。例如下图,View22是焦点,最顶层的View 通过 mFoucs 的关系链找到最后形成的路径就是 Foucs Path。如下图红线所示:

ViewRoot

  • ViewRoot 实际上是一个 Handler,ViewRoot 简历主View 与 WindowsManager 通讯的桥梁。
  • ViewRoot 本质上就是一个 Handler,我们知道 Handler 的基本功能 就是处理回调,发送消息。

ViewRoot 通过 IWindowSession AIDL 添加窗口到 Window Manager ,而 IWindow AIDL 是Window Manager 分发消息给 Client ViewRoot 的渠道。

Window Manager Proxy

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 管理的窗口是应用程序的 Top-Level 窗口,这里称之为 主窗口,为什么主窗口要放到 Service 来管理呢?其实 放在一起管理是为了计算 Z-order 序列,根据应用程序的状态来显示/隐藏应用程序的窗口。

在 Service 维护了一个 mWindow 数组,这个 mWindow 就是 Window 的 Z-order序 数组。mWindowMap 用于记录 <Client:Binder,WindowState对象>。

在服务端的窗口对象叫做 WindowState 。WindowState 有一个叫做 mClient 成员变量来记录客户端 IWindow 实例,通过 IWindow 接口实例,Service可以访问客户端的信息,可以传递消息到客户端。所以说呢 IWindow 是 Service 链接 View 的桥梁。

http://blog.sina.com.cn/s/blog_4b3c1f950100qe9m.html

转自:

[转][android深入学习]android窗口管理机制相关推荐

  1. [android开发必备]Android开发者社区汇总

    [android开发必备]Android开发者社区汇总 经常收到很多人问做android开发去哪个社区,每次都回答的零零碎碎的很比系统,今天统一整理下,把截至目前为止有价值的android开发社区汇总 ...

  2. Android进阶——性能优化之内存管理机制和垃圾采集回收机制(六)

    文章大纲 引言 一.内存泄漏和内存溢出概述 二.Java运行时内存模型 1.线程私有数据区 1.1.程序计数器PC 1.2.虚拟机栈 1.3 本地方法栈 2.所有线程共享数据区 2.1.Java堆 2 ...

  3. android窗口管理机制

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

  4. Android FrameWork 学习之Android 系统源码调试

    这是很久以前访问掘金的时候 无意间看到的一个关于Android的文章,作者更细心,分阶段的将学习步骤记录在自己博客中,我觉得很有用,想作为分享同时也是留下自己知识的一些欠缺收藏起来,今后做项目的时候会 ...

  5. Android开发学习——2.Android开发环境准备

    文章目录 一.引言 二.开发前准备 1. JDK 2. Android SDK 3. Android Studio 三.结尾 四.参考 一.引言 前一篇文中提到了Android Studio(简称AS ...

  6. Android Framework学习(八)之Handler消息机制(Native层)解析

    在深入解析Android中Handler消息机制一文中,我们学习了Handler消息机制的java层代码,这次我们来学习Handler消息机制的native层代码. 在Java层的消息处理机制中,Me ...

  7. Android usb学习笔记:Android AOA协议Android端 流程总结

    背景 上篇文章中我们了解了嵌入式设备端将Android手机设置为accessory模式的流程以及嵌入式设备端接收和发送数据的流程,本文将对应介绍Android端accessory模式被激活的过程,以及 ...

  8. Android动画学习笔记-Android Animation

    3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这三 ...

  9. android窗口动画体系,Android 7.1 GUI系统-窗口管理WMS-动画的执行(七)

    前面只是动画资源的加载过程,下面看下动画是怎么执行起来的? 前面在分析窗口申请的过程中,分析过relayoutWindow中的调用performSurfacePlacement,在这个函数的最后调用了 ...

最新文章

  1. PHP的Smarty
  2. 微软职位内部推荐-SW Engineer for Skype
  3. 从Thread.start()方法看Thread源码,多次start一个线程会怎么样
  4. 专家谈家教中的心理健康教育
  5. Web 仿 App 动画竟然引出了“性能杀手”
  6. php 上传100m文件,PHP向MySQL中insert100M以上的文件
  7. 弦图与完美消除序列(bzoj 1006: [HNOI2008]神奇的国度)
  8. 阶段3 1.Mybatis_11.Mybatis的缓存_7 触发清空一级缓存的情况
  9. Ubuntu16.04上使用Anaconda3的Python3.6的pip安装UWSGI报错解决办法
  10. android studio gradle下载失败处理
  11. 在进行ISO14001认证审核之前,需要注意什么?
  12. 计算机网络安全技术实验教程,网络安全实验教程
  13. 一个人的生命周期,就是人的一生
  14. 苹果开发者账号续费提示“支付授权失败”的问题
  15. 暗影精灵5风扇怎么调_惠普暗影精灵5内部结构是怎么样的 他的散热效果好不好呢...
  16. 重庆OA办公系统目前推出PC端、移动终端(安卓、IOS、平板)- 上弦科技
  17. Python语言程序设计——实验八
  18. javascript中的getElementById、getElementsByName、getElementByTagName详解
  19. 微软重拾荣光:股价距1999年历史高点仅差7%
  20. python中的列表生成式 | 字典生成式

热门文章

  1. OpenResty 最佳实践
  2. 机器学习中的L1与L2正则化图解!
  3. 算法原理:大数据处理的分治思想!
  4. 实践教程 | 浅谈 PyTorch 中的 tensor 及使用
  5. CVPR 2021|一个绝妙的想法:在类别不平衡的数据上施展半监督学习
  6. GPU模拟猴子大脑,普通台式机变超算,英国大学研究登上Nature子刊
  7. 月薪50K的机器学习工程师,需要具备哪些条件?
  8. 使用神经网络提取PDF表格工具来了,支持图片,关键是能白嫖谷歌GPU资源
  9. 公司又有人被开除了,这次真的是...
  10. 【面试现场】如何在10亿数中找出前1000大的数