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

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

PhoneWindow

要想知道PhoneWindow具体是做什么的,首先需要了解一下Window具体是什么:

Abstract base class for a top-level window look and behavior policy. An instance of this class should be used as the top-level view added to the window manager. It provides standard UI policies such as a background, title area, default key processing, etc.

以上是官方文档对于Window的介绍,从中可以知道Window是一个管理视图的顶层容器,负责视图的绘制以及行为,包括标题,背景等等都归其负责。该类的实例也会被添加到WindowManager加以管理。看起来Window的权利很大,但其实它只是一个抽象类,说白了就是一个傀儡,具体的工作都不是它做的,而是交给了我们要讲的PhoneWindow
PhoneWindowWindow唯一的实现类,也继承了Window所有的权利,可以说是一个挟天子以令诸侯的狠角色。不过我们平时很少会直接与PhoneWindow打交道,日常的实物都是交给ViewRoot去打理的。
通过上述的介绍,我们可以发现Window在Android系统中并不是一个很重要的概念,这似乎是Google有意为之的,弱化Window概念而强化View概念。

ViewRoot

ViewRoot对应于ViewRootImpl,它是连接WindowManagerDecorView的纽带,View的三大流程(measure,layout,draw,后续文章会介绍这三大流程)均是通过ViewRootImpl来完成的。在ActivityThreadActivityThread是应用程序空间中的中重要概念,真正对应应用进程的不是Application而是ActivityThread。每个应用程序都是以ActivityThread.main()作为程序入口进入到消息循环处理中并提供了一个IActivityThread接口作为与Activity Manager Service的通讯接口.通过该接口AMS可以将Activity的状态变化传递到客户端的Activity对象,详细内容后续文章会介绍)中,当Activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并为两者建立关联。

DecorView

虽然PhoneWindow,ViewRoot都是属于Android窗口结构中的一部分,但是真正与用户所见相关的部分还是从DecorView开始的。DecorView才是真正的顶级View,一般情况下它内部会包含一个竖直方向的LinearLayout,在这个LinearLayout里面有上下两个部分,上面是标题栏,下方才是内容栏。在Activity中通过我们通过设置setContentView设置的部分就是内容栏部分。内容栏的id为content,所以称之为setContentView,通过代码:

ViewGroup content = (ViewGroup)findViewById(R.id.content)

即可以得到content。而content内部便是我们自己设定的View了。
以上内容便是Android窗口的基本架构,理解清楚了基本结构后,才能更好地理解View的事件分发以及和WindowManager的交互。这部分内容会在下一篇博客中详细介绍。

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

Android窗口管理(1)——窗口基本架构的相关文章

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

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

android 浏览器之多窗口方案详解

android 浏览器之多窗口方案详细介绍,需要的朋友可以过来参考下   我们Android平台是一个又一个的Activity组成的,每一个Activity有一个或者多个View构成. 所以说,当我们想显示 一个界面的时候,我们首先想到的是建立一个Activity,然后所有的操作在Activity里面实现,或者是一个Dialog或者Toast.这种方 式固然简单,但是在有些情况下,我们要求的只是简单的显示,用Activity显然是多余,这个时候,我们如何处理呢? Android的一个应用在底层也

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

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

android自由改变Dialog窗口位置的方法_Android

本文实例讲述了android自由改变Dialog窗口位置的方法.分享给大家供大家参考.具体如下: Dialog dialog = new Dialog(this); dialog.setContentView(R.layout.dialog_layout); dialog.setTitle("Custom Dialog"); //获得当前窗体 Window window = dialog.getWindow(); //重新设置 WindowManager.LayoutParams lp

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

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

android自由改变Dialog窗口位置的方法

本文实例讲述了android自由改变Dialog窗口位置的方法.分享给大家供大家参考.具体如下: Dialog dialog = new Dialog(this); dialog.setContentView(R.layout.dialog_layout); dialog.setTitle("Custom Dialog"); //获得当前窗体 Window window = dialog.getWindow(); //重新设置 WindowManager.LayoutParams lp

Android分屏多窗口的实践代码

Android N 中推出了多窗口支持,项目要求适配多窗口模式,记录一下. 1.生命周期:对于完全没有适配多窗口的APP来说,当启用多窗口模式或者拖动窗口时,会出现Activity销毁重新加载的现象. 解决方法:在manifest文件里面给activity加上下面一行属性 android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" 2.当启用多窗口模式时,可能有改变原UI的需求,这时可以在

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

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

MFC子窗口和父窗口(SetParent,SetOwner)

一.概念和区别 在windows系统中,每个窗口对象都对应有一个数据结构,形成一个list链表.系统的窗口管理器通过这个list来获取窗口信息和管理每个窗口.这个数据结构中有四个数据用来构建list,即child.sibling.parent.owner四个域.所以我们可以看到,窗口之间的关系有两种:owner-owned 关系和 parent-child关系.前者称之为拥有/被拥有关系,后者称之为父/子关系.在这篇文字中,我把owner窗口称之所有者窗口.换句话说,一个窗口在有一个父窗口(pa

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

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