您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 麦子学院Android开发教程窗口管理机制
IT在线教育平台———麦子学院:开发,首先需要了解android基本架构,如下:1.基本架构原理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就需要提供在不同机器间应用程序间的通信,数据转换,并提供多对象系统的无缝连接。IT在线教育平台———麦子学院:的本质以图的形式展现就是如下:在服务端,多了个代理器:分析了CORBA的大体理论架构,下面我们来看一下Android的对象代理结构:在结构图中,我们可以较为清楚的把握Android的IPC包含了如下的概念:设备上下文什(ContextObject)设备上下文包含关于客服端,环境或者请求中没有作为参数传递个操作的上下文信息,应用程序开发者用ContextObject接口上定义的操作来创建和操作上下文。Android代理:这个是指服务端在客户端的代理对象Binder:Linux内核提供的Binder通讯机制(底层)IT在线教育平台———麦子学院:AIDL:Android中的远程接口Android的外特性空间是不需要知道服务在那里,只要通过代理对象完成请求。2.窗口管理概述了解了Android的基本架构原理,现在我们回到窗口管理这一块。Android的窗口管理是基于C/S模式的,客户端就是应用程序,服务端就是WindowManager服务。如下图:Activity建立一个主窗口之后,在将主窗口添加到WindowManager时,首先要建立WindowManager的代理对象,并打开一个Session(session:会话;实现IWindowSessionAIDL接口),并维持该会话(Activity将通过该会话与WindowManager建立联系,这个Session是C/S体系的基础)。Client通过这个Session将window加入到WindowManager中。一个完整的窗口概念包含了View,ViewRoot,WindowManagerService,Window,DecorView,IWindow,ISession,WindowState。他们之间的关系如下:Client端的Activity通过IWindowSession会话与WindowManagerService建立对话,而WindowManagerService通过IWindow接口访问Client,将消息传递到Client端,在通过消息分发渠道,将消息传递到具体的消息处理函数。(用户输入等操作最先是到窗口管理服务,由窗口管理服务发给活动窗口,再一步步传递到焦点)。IT在线教育平台———麦子学院:端客户端组成:Window,View,ViewRoot,WindowManagerProxyView:View在Android中包含了交互和显示。在Activity在performLaunchActivity时,会使用Activity.attach()建立一个PhoneWindow主窗口。这个主窗口的建立并不是一个重点。handleResumeActivity真正要启动一个Activity的时候,会将主窗口加入到WindowManager,当然并不是主窗口本身,而是指的主窗口的DecorView。DecorView:实际上是一个ViewGroup,在依存关系上来讲,对看这主窗口来讲,DecorView是Top-LevelView。如下图:View的成员变量mParent用来管理View上级关系。而ViewGroup里构建了焦点管理和子View节点数组。这样通过View的mParent和ViewGroup的mChildren构建了Android中View直接的关系网。如下图:FocusPath所谓的FoucsPath就是我们的KeyEvent传递的路线。一般的我们的KeyEvent在主循环中,主View通过View的焦点记录关系传递到焦点View。例如下图,View22是焦点,最顶层的View通过mFoucs的关系链找到最后形成的路径就是FoucsPath。IT在线教育平台———麦子学院:如下图红线所示:ViewRootViewRoot实际上是一个Handler,ViewRoot简历主View与WindowsManager通讯的桥梁。ViewRoot本质上就是一个Handler,我们知道Handler的基本功能就是处理回调,发送消息。ViewRoot通过IWindowSessionAIDL添加窗口到WindowManager,而IWindowAIDL是WindowManager分发消息给ClientViewRoot的渠道。WindowManagerProxyActivity在使用getSystemService获取IT在线教育平台———麦子学院:时,建立了一个WindowManagerImpl的实例,这就是WindowManager服务的代理。wm=(WindowManagerImpl)context.getSystemService(Context.WINDOW_SERVICE);并调用wm.addview添加窗口到WMService中。在这个过程中客户端建立了什么样的管理框架,并如何这个会话?在WindowManagerProxy中建立了View,Layout,ViewRoot散着的对应关系表。构造一个ViewRoot就会打开一个Session,并利用IWindowSession简历会话上下文。如下图:4.服务端----WindowManagerServiceWindowManagerService管理的窗口是应用程序的Top-Level窗口,这里称之为主窗口,为什么主窗口要放到Service来管理呢?其实放在一起管理是为了计算Z-order序列,根据应用程序的状态来显示/隐藏应用程序的窗口。在Service维护了一个mWindow数组,这个mWindow就是Window的Z-order序数组。mWindowMap用于记录Client:Binder,WindowState对象。在服务端的窗口对象叫做WindowState。WindowState有一个叫做mClient成员变量来记录客户端IWindow实例,通过IWindow接口实例,Service可以访问客户端的信息,可以传递消息到客户端。所以说呢IWindow是Service链接View的桥梁。如需了解更多相关知识,请至麦子学院官网查询()。
本文标题:麦子学院Android开发教程窗口管理机制
链接地址:https://www.777doc.com/doc-1926200 .html