Android窗口管理服务WindowManagerService的简要介绍和学习计划

       在前一个系列文章中,我们从个体的角度来分析了Android应用程序窗口的实现框架。事实上,如果我们从整体的角度来看,Android应用程序窗口的实现要更复杂,因为它们的类型和作用不同,且会相互影响。在Android系统中,对系统中的所有窗口进行管理是窗口管理服务WindowManagerService的职责。在本文中,我们就将简要介绍WindowManagerService的职能以及制定学习计划。

       我们知道,在Android系统中,同一时刻,只有一个Activity窗口是激活的,但是,对于WindowManagerService服务来说,这并不意味着它每次只需要管理一个Activity窗口,例如,在两个Activity窗口的切换过程中,前后两个Activity窗口实际上都是可见的。即使在只有一个Activity窗口是可见的时候,WindowManagerService服务仍然需要同时管理着多个窗口,这是因为可见的Activity窗口可能还会被设置了壁纸窗口(Wallpaper Winodw)或者弹出了子窗口(Sub Window),以及可能会出现状态栏(Status Bar)以及输入法窗口(Input Method Window),如图1所示。

1357404325_1912.jpg

图1 Activity窗口及其子窗口、壁纸窗口、输入法窗口和状态栏的位置结构

       因此,WindowManagerService服务是不可以假设同一时刻它只需要管理一个窗口的,它需要通过各个窗口在屏幕上的位置以及大小来决定哪些窗口需要显示的以及要显在哪里,这实际上就是要计算出各个窗口的可见区域。

       从前面Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析一文可以知道,SurfaceFlinger服务在渲染整个屏幕的UI的时候,会对各个窗品的可见性进行计算,因此,WindowManagerService服务只要将它所管理的各个窗品的位置以及大小告诉SurfaceFlinger服务,后者可以帮帮它计算出各个窗口的可见区域了。注意,这里,这里所说的窗口位置包括窗口在X、Y和Z轴的位置。

      WindowManagerService服务大致按照以下方式来控制哪些窗口需要显示的以及要显在哪里:

      1. 每一个Activity窗口的大小都等于屏幕的大小,因此,只要对每一个Activity窗口设置一个不同的Z轴位置,然后就可以使得位于最上面的,即当前被激活的Activity窗口,才是可见的。

      2. 每一个子窗口的Z轴位置都比它的父窗口大,但是大小要比父窗口小,这时候Activity窗口及其所弹出的子窗口都可以同时显示出来。

      3. 对于非全屏Activity窗口来说,它会在屏幕的上方留出一块区域,用来显示状态栏。这块留出来的区域称对于屏幕来说,称为装饰区(decoration),而对于Activity窗口来说,称为内容边衬区(Content Inset)。

      4. 输入法窗口只有在需要的时候才会出现,它同样是出现在屏幕的装饰区或者说Activity窗口的内容边衬区的。

      5. 对于壁纸窗口,它出现需要壁纸的Activity窗口的下方,这时候要求Activity窗口是半透明的,这样就可以将它后面的壁纸窗口一同显示出来。

      6. 两个Activity窗口在切换过程,实际上就是前一个窗口显示退出动画而后一个窗口显示开始动画的过程,而在动画的显示过程,窗口的大小会有一个变化的过程,这样就导致前后两个Activity窗口的大小不再都等于屏幕的大小,因而它们就有可能同时都处于可见的状态。事实上,Activity窗口的切换过程是相当复杂的,因为即将要显示的Activity窗口可能还会被设置一个启动窗口(Starting Window)。一个被设置了启动窗口的Activity窗口要等到它的启动窗口显示了之后才可以显示出来。

      从以上六点就可以看出,窗口在X、Y和Z轴的位置及其大小的计算非常重要,它们共同决定了一个窗口是否是整体可见的,还是部分可见的,或者整体不可见的。在Android系统中,WindowManagerService服务是通过一个实现了WindowManagerPolicy接口的策略类来计算一个窗口的位置和大小的。例如,在Phone平台上,这个策略类就是PhoneWindowManager。这样做的好处就是对于不同的平台实现不同的策略类来达到不同的窗口控制模式。

     从上面的描述就可以看出,WindowManagerService服务除了要与Activity窗口所运行在的应用程序进程打交道之外,还需要与SurfaceFlinger服务以及窗口管理策略类PhoneWindowManager交互,如图2所示。

1357412404_2148.jpg

图2 WindowManagerService服务与Activity窗口、SurfaceFlinger服务、PhoneWindowManager策略的关系图

       在前面Android应用程序窗口(Activity)实现框架简要介绍和学习计划的一系列文章中,我们已经分析过应用程序进程与WindowManagerService服务之间的交互过程了,因此,在这一系列文章中,我们就将主要分析WindowManagerService服务的实现,以及它与SurfaceFlinger服务、PhoneWindowManager策略类的交互过程。

       从总体上来看,WindowManagerService服务的实现是相当复杂的,例如,WindowManagerService类的核心成员函数performLayoutAndPlaceSurfacesLockedInner的代码有1200+行,比600-行代码的ViewRoot类的核心成员函数performTraversals还要恐怖。不过,WindowManagerService服务实现的复杂性是在预料之中的,毕竟它要管理的整个系统所有窗口的UI,而在任何一个系统中,窗口管理子系统都是极其复杂的。基于上述理由,采用硬碰硬的方式来分析WindowManagerService服务的实现是以卵击石,因此,这个系列的文章将对WindowManagerService服务进行分拆,然后再逐个击破,这是算法中的分而治之思想是一致的。

       具体来说,我们将按照以下几个情景来分析WindowManagerService服务的实现:

       1. 窗口大小和位置(X轴和Y轴)的计算过程。

       2. 窗口的组织方式。

       3. 输入法窗口的调整过程。

       4. 壁纸窗口的调整过程。

       5. 窗口Z轴位置的计算和调整过程。

       6. Activity窗口的启动窗口的显示过程。

       7. Activity窗口的切换过程。

       8. Activity窗口的动画显示过程。

       再次地,由于WindowManagerService服务的实现实在是太复杂,因此上述八个情景可能还不足于说明WindowManagerService服务的实现。如果出现这种情况,我们在分析的过程中会进行相应的调整。相信对WindowManagerService服务的实现进行分而治之的分析后,我们就可以对Android系统的UI架构有一个深刻的理解!敬请关注接下来的文章!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Andorid之为何要用到NDK?

概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C库反汇难度较大。 2. 在NDK中调用第三方C/C库,因为大部分的开源库都是用C/C代码编写的。 3. 便于移植,用C/C写得库可以方便在其…

日本最惨数学天才!37岁裸辞,房子被政府没收,向全村人乞讨,一家五口只能吃野菜.........

全世界只有3.14 % 的人关注了爆炸吧知识数学是火他是飞蛾多年以后,当冈熙哉站在桥本市的数学家纪念碑前,准会想起父亲请他吃面包片的那个遥远的夜晚。当时,他们一家五口蜗居在邻居施舍租出的小库房里。冈洁家三代同堂在他的回忆中&#xff0c…

3、Eternal框架-控制器

2019独角兽企业重金招聘Python工程师标准>>> 介绍 MVC:Model-View-Controller,包括三类对象,Model模型对象、View视图表示、Controller控制器。在应用MVC方式以前,通常将这三个对象的功能合到了一起,通过分…

java配置JDK

1、将JDK文件拷入电脑并解压缩 根据系统版本选择JDK版本,并将eclipse解压缩 2、配置系统环境变量 右键我的电脑--属性--高级系统设置--环境变量 新建JAVA_HOME如图所示(严格区分大小写) 修改环境变量Path 在变量值一栏的最前面加上%JAVA_HOM…

可怕!原来我们看到的世界地图一直都是“错”的!多年的地理白学了...

▲ 点击查看几乎每个家庭都会有两张地图:一张世界地图,一张中国地图。薄薄的两张纸,蕴藏着让每个人学会“看世界”的磅礴力量。哈佛上一任校长,也是300多年来唯一一位女校长德鲁吉尔平福斯特(Drew Gilpin Faust&#x…

.NET 程序测试 Java 项目 log4j2 是否存在远程代码执行漏洞

最近两天被朋友圈的“Apache Log4j2 远程代码执行漏洞”刷屏了,主要是因为组件存在 Java JNDI 注入漏洞:当程序将用户输入的数据记入日志时,攻击者通过构造特殊请求,来触发 Apache Log4j2 中的远程代码执行漏洞,从而利…

史上最牛的文科生:法学出身,却发明出十进制计算器,折磨无数人的微积分符号,跨界40多个领域惊艳学术圈

全世界只有3.14 % 的人关注了爆炸吧知识“世界上没有完全相同的两片树叶。”想必大家对这句话耳熟能详,但却不知道这名言背后的作者是谁吧?其实,他就是与牛顿争论微积分优先权大战中的大佬:莱布尼茨。博览群书 天赋异禀1646年&…

如何解决secureCRT里面的The remote system refused the connection.

不废话,先爆照 Ubuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即可。然后确认sshserver是否启动了: ps -e |grep ssh 如果只有ssh-agent那ss

python 带pydev的eclipse无法导入win32api包(或无法导入其他包)

需要重新配置pydev中的python解释器,因为它不会自动更新。 将原先的python.exe先remove掉,再重新new回来,new回来的时候会让你勾选system libs,把你想要更新的勾选上去就可以了。转载于:https://blog.51cto.com/xuewei/1111889

OC之非ARC环境下循环retain问题

观察上述情况,上述就是著名的循环引用问题,对于此类问题,“你包含我,我包含你”,里面相关的对象占用的内存永远回收不了,解决办法很简单,与常规方法不同。正常情况下,我们应在Person…

我的开源故事

| 作者:李扬| 编辑:钱奕| 设计:杨敏| 责编:钱英宇一、前 言我相信我与开源故事的开始并不是第一次用GitHub或者CSDN,而是突如其来的新冠疫情。2020年1月25日,大年初一,范晶晶的一条关于wuhan202…

Spring+EhCache缓存实例(详细讲解+源码下载)

转载注明出处http://blog.csdn.net/u013142781 一、ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。…

大型打脸现场!被藐视的少女摇身一变成为“抽象代数之母”,哲学教授只能跪地喊爸爸...

全世界只有3.14 % 的人关注了爆炸吧知识今天小天要为大家介绍一位数学界的女神。在爱因斯坦、帕维尔亚历山德罗夫等人的眼中,她是数学史上最重要的女人,甚至被爱因斯坦称为数学界的雅典娜。她,就是诺特定理的提出者——艾米诺特。艾米诺特上学…

组策略应用之一:映射网络驱动器

在部署文件服务器时,我们经常会用映射网络驱动器的方法访问共享文件,但如果有新员工离职、调岗或更换电脑后,就不得不重新映射网络驱动器,在一定程度上即增加了系统管理员的工作负担,另外在一定程度上也会影响员工的工…

Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示...

Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示 今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结&#xff0c…

C# WPF MVVM开发框架Caliburn.Micro 名称Transformer⑩①

使用名称TransformerNameTransformer是在Caliburn.Micro v1.1中引入的,它是ViewLocator和ViewModelLocator如何将类名映射到其伙伴角色的一个组成部分。虽然您可以覆盖这些服务上的各种函数来替换底层行为,但您的大多数需求都应该通过使用适当的NameTran…

史上最可怜的科学家:出生先天不足,家道中落吃不上饭,追个星丢工作,拜师被冤枉,写书又被烧,最后还被拖工资活活拖死了......

全世界只有3.14 % 的人关注了爆炸吧知识今天,小天来向各位模友介绍一个痴迷偶像正面刚的小迷弟吧。多病的贫家子,鲁莽的小迷弟1571年,开普勒在德国维尔镇呱呱落地了。作为一个善解人意的宝宝(胚胎),开普勒没…

C# WPF MVVM开发框架Caliburn.Micro View / View Model 命名⑨

01—约定在收到Caliburn Micro中有关视图和ViewModel解析的反馈后,我们添加了新功能,以简化类型解析,同时保持驱动它的健壮的基于正则表达式的名称转换机制。为了更好地了解这些新功能以及类型解析通常如何在框架中工作,现在是详细…

史上最气人的数学家:文理双全智商还高,说话只说半句,解题只解半个,调戏人调戏了三百年还不够......

全世界只有3.14 % 的人关注了爆炸吧知识大家上学的时候有没有想过:在数学试卷上调戏阅卷人。想想小天,会都不会写,还调戏阅卷人?想都不敢想。但一个知乎大佬就做了。他居然用费马的原话作答:我已经想到了一个极佳的证明…

掌握这个姿势,女友不再叨叨叨

1 请收下我的膝盖2 正确姿势3 前世五百次的回眸 才换来今生的一次神同步4 论引体向上,你是不如我的5 教科书式的傲娇6 只有我最摇摆7 这是什么原理?你点的每个赞,我都认真当成了喜欢