android窗口管理框架简介

窗口管理是android的一个核心内容。它管理着窗口的创建和销毁,布局和大小,焦点的控制等等。

窗口可以分为两类:

一种是应用窗口,即由具体应用创建的窗口,其实其中还可以细分出父窗口和子窗口。窗口一般都会对应一个activity。

一种是系统窗口,如状态栏,这类窗口由系统直接通过windowManager来创建,和activity无关。

在这里,窗口的概念其实可以说由三部分构成,一部分是用来描述窗口信息的,由WindowState对象表示。一个WindowState对象对应一个窗口,它拥有绘制窗口所需要的信息。但是真正去绘制窗口需要另一部分内容Surface来完成,最终会通过surfaceflinger完成绘图。还有一部分就是对消息的处理,windowmanagerService把窗口信息传递给InputManager,这样InputDispatcher就能根据当前窗口的状态进行消息处理。

我们先看下整体的架构图,然后再来看这两种窗口的创建。WindowManager和其他很多android的服务一样,采用C/S的架构。其中windowManagerService跑在System_server进程,作为服务端,客户端通过ipc调用和它进行交互。

我们通过完整的应用程序窗口创建流程来了解这个结构和整个过程。我们不去纠结其中代码的一些细枝末节的东西,通过整体和重要的东西来看。

一.客户端部分

在客户端,在应用启动的时候,ActivityThread会调用performLaunchActivity方法,去实例化一个activity,同时调用attach方法,并传递很多和activity相关的参数信息。其中有个比较重要的东西是一个IBinder对象token,这个token成为activity的标识,windowmanagerService可以通过这个token获得activity当前的运行状态。在WindowManager中会通过该token生成一个WindowToken对象,一个父窗口对应一个WindowToken,而具有相同token的所有其子窗口都会被归到一个WindowToken中。即如果token相同,表示他们都会在一个窗口中。还有个用来标识窗口的类AppWindowToken,继承自WindowToken,它由activity传过来的token生成,和Activity一一对应。通过token,就能找到activity和window的对应关系了。

继续往下看,attach方法会通过代码mWindow = PolicyManager.makeNewWindow(this)实例化一个phoneWindow对象,但是这个对象还是比较抽象的东西。在activity开始oncreate调用时,会调用setContentView方法。会去获得之前那个phoneWIndow对象对应的DecorView,最后通过层层窗口修饰(状态栏等)后调用activity的makeVisible方法,在方法中通过addiew方法完成窗口的添加。

windowManager只是提供接口,用了桥接模式,真正实现是WindowManagerImpl类。而调用addiew方法的对象来自另一个类LocalWindowManager,它会做一些简单检查,再通过WindowManagerImp类的addview完成窗口添加。addview大概分三步执行:

1.校验该窗口是否已经添加过了。

2.判断窗口类型如果是子窗口,则找到它附属的父窗口

3.new一个ViewRootImpl对象,最后调用该对象的setView方法。

setView 方法会最终会通过ipc调用IwindowSession的add方法。Session类实现了该方法,并最终给WindowManagerService处理。客户端的工作至此就完成了。

这里说明一下ViewRootImpl类,这其实是个handler。自然的,它一部分功能就是对消息进行处理,将用户的一些操作分发到view中。它也是view和WindowManagerService的桥梁。可以看到它通过一个会话将信息传递到了WindowManagerService。而WIndowManagerService也会通过IWindow接口将指令通过消息的方式发送到ViewRootImpl,ViewRootImpl处理这些消息。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/OS/extra/

时间: 2024-09-17 04:55:16

android窗口管理框架简介的相关文章

Android窗口管理(2)——消息传递

本文内容参考:Android 核心分析(13) -–Android GWES之Android窗口管理 上一篇文章主要讲述了窗口的基本结构,那么在这样的结构下,系统如何管理窗口,如何下发事件,如何获取窗口状态?这篇博客将对这部分的内容进行介绍. Android在窗口管理上采用了最为经典的C/S模式,Client端是各个Activity中的window,而Service端就是系统持有的窗口管理器Window Manager. 总体结构 Window是顶级的窗口概念,而Activity中的DecorV

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

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

Android InputMethodManager输入法简介_Android

一.结构 public final class InputMethodManager extends Object Java.lang.Object android.view.inputmethod.InputMethodManager 二.类概述 整个输入法框架(IMF)结构的核心API,应用程序之间进行调度和当前输入法交互.你可以用Context.getSystemService()取得这一接口的实例. 架构总述(Architecture Overview) 输入法框架(IMF)共有三个主要

Android JNI知识简介

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17361775 前言 上周对Android中的事件派发机制进行了分析,这次博主要对消息队列和Looper的源码进行简单的分析.大家耐心看下去,其实消息队列的逻辑比事件派发机制简单多了,所以大家肯定会很容易看懂的. 概念 1. 什么是消息队列 消息队列在android中对应MessageQueue这个类,顾名思义,消息队列中存放了大量的消息(Message) 2.什么是消息 消

实现一个用于显示当前时间的Google Android 窗口小部件(AppWidget)

本文为原创,如需转载,请注明作者和出处,谢谢!     Android不用我多说了,这是Google在2007年推出的一款主要用于移动设备的操作系统.google在android sdk1.5中加入了appwidget api.通过这项技术,可以在android手机的主界面(Home界面)显示可以拖动的窗口,用于显示各种用户需要的信息.至于显示什么,就完全依靠开发人员的想象力了.OK,废话少说.我们先来体验一下如何开发一个显示当前时间的appwidget.这个appwidget每秒刷新一次,显示

实现一个用于显示当前时间的Google Android 窗口小部件(AppWidge

本文为原创,如需转载,请注明作者和出处,谢谢!     Android不用我多说了,这是Google在2007年推出的一款主要用于移动设备的操作系统.google在android sdk1.5中加入了appwidget api.通过这项技术,可以在android手机的主界面(Home界面)显示可以拖动的窗口,用于显示各种用户需要的信息.至于显示什么,就完全依靠开 发人员的想象力了.OK,废话少说.我们先来体验一下如何开发一个显示当前时间的appwidget.这个appwidget每秒刷新一次,显

Android——开发环境简介

一,安卓平台概览 1,安卓采用分层架构:从上到下分别为: 1,应用程序层:包含了许多核心的引用程序,例如短信,日历: 2,应用程序框架:开发者可以完全访问核心应用程序所使用的API框架.该层简化了组件的复用,使得开发人员可以直接使用系统提供的组件来进行快速地开发,也可以通过集成灵活的加以扩展. 3,系统运行库:系统库和android运行时,部分C库跟Java库. 4,linux内核 2,安卓开发中四个重要组件: 1,activity 负责应用程序中数据的显示   2,Intent 在应用程序当中

Android 显示原理简介

转:http://djt.qq.com/article/view/987 作者:yearzhu,2011年进入腾讯公司,从事过Web端及移动端的测试工作,喜爱新鲜事物及新技术,目前在SNG开放平台测试组负责的移动互联SDK的测试工作.   现在越来越多的应用开始重视流畅度方面的测试,了解Android应用程序是如何在屏幕上显示的则是基础中的基础,就让我们一起看看小小屏幕中大大的学问.这也是我下篇文章--<Android应用流畅度测试分析>的基础.       首先,用一句话来概括一下Andro

Android InputMethodManager输入法简介

一.结构 public final class InputMethodManager extends Object Java.lang.Object android.view.inputmethod.InputMethodManager 二.类概述 整个输入法框架(IMF)结构的核心API,应用程序之间进行调度和当前输入法交互.你可以用Context.getSystemService()取得这一接口的实例. 架构总述(Architecture Overview) 输入法框架(IMF)共有三个主要