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

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

本文给大家介绍以下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的交互。这部分内容会在下一篇博客中详细介绍。

相关文章
|
1月前
|
数据库 Android开发 开发者
构建高性能微服务架构:从理论到实践构建高效Android应用:探究Kotlin协程的优势
【2月更文挑战第16天】 在当今快速迭代和竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性和独立部署能力而受到企业的青睐。本文将深入探讨如何构建一个高性能的微服务系统,涵盖从理论基础到具体实现的各个方面。我们将重点讨论服务拆分策略、通信机制、数据一致性以及性能优化等关键主题,为读者提供一个清晰、实用的指南,以便在复杂多变的业务环境中构建和维护健壮的微服务体系结构。 【2月更文挑战第16天】 在移动开发领域,性能优化和流畅的用户体验是至关重要的。随着技术的不断进步,Kotlin作为一种现代编程语言,在Android开发中被广泛采用,尤其是其协程特性为异步编程带来了革命性的改进。本文旨在深入
241 5
|
3月前
|
数据采集 小程序 数据可视化
智慧校园电子班牌管理系统源码 Java Android原生
家长通过家长小程序端随时了解孩子在校的情况,实时接收学生的出勤情况,学生到校、离校时间。随时了解学生在校的表现、学生成绩排名,及时与教师沟通,关注孩子的健康成长。
30 0
智慧校园电子班牌管理系统源码 Java Android原生
|
5月前
|
Java 关系型数据库 MySQL
0002Java安卓程序设计-基于Uniapp+springboot菜谱美食饮食健康管理App2
0002Java安卓程序设计-基于Uniapp+springboot菜谱美食饮食健康管理App
34 0
|
3月前
|
存储 Cloud Native 数据处理
Flink 2.0 状态管理存算分离架构演进
本文整理自阿里云智能 Flink 存储引擎团队负责人梅源在 Flink Forward Asia 2023 的分享,梅源结合阿里内部的实践,分享了状态管理的演进和 Flink 2.0 存算分离架构的选型。
839 0
Flink 2.0 状态管理存算分离架构演进
|
2天前
|
传感器 Java Android开发
Android HAL深入探索(1): 架构概述
Android HAL深入探索(1): 架构概述
18 1
|
2天前
|
存储 开发工具 Android开发
Android系统 权限组管理和兼容性
Android系统 权限组管理和兼容性
12 0
|
10天前
|
消息中间件 存储 数据库
RabbitMQ入门指南(二):架构和管理控制台的使用
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了RabbitMQ架构和管理控制台的使用等内容。
30 0
RabbitMQ入门指南(二):架构和管理控制台的使用
|
13天前
|
存储 数据库 Android开发
构建高效安卓应用:采用Jetpack架构组件优化用户体验
【4月更文挑战第12天】 在当今快速发展的数字时代,Android 应用程序的流畅性与响应速度对用户满意度至关重要。为提高应用性能并降低维护成本,开发者需寻求先进的技术解决方案。本文将探讨如何利用 Android Jetpack 中的架构组件 — 如 LiveData、ViewModel 和 Room — 来构建高质量的安卓应用。通过具体实施案例分析,我们将展示这些组件如何协同工作以实现数据持久化、界面与逻辑分离,以及确保数据的即时更新,从而优化用户体验并提升应用的可维护性和可测试性。
|
24天前
|
移动开发 前端开发 数据管理
构建高效Android应用:采用MVVM架构与LiveData的全面指南
在移动开发领域,构建一个既快速又可靠的应用对于开发者来说至关重要。随着Android Jetpack组件的推出,MVVM(Model-View-ViewModel)架构和LiveData已成为实现响应式、可测试且易于维护应用的首选解决方案。本文将深入探讨如何在Android应用中实施MVVM模式,以及如何利用LiveData来优化UI组件的数据更新流程,确保用户界面与业务逻辑之间的高度解耦和流畅交互。
18 4
|
4月前
|
存储 前端开发
Flutter Provider状态管理---MVVM架构实战
Flutter Provider状态管理—MVVM架构实战 在Flutter中,状态管理是一个非常重要的概念。Flutter Provider是一种状态管理的解决方案,它提供了一种简单,灵活和高效的方法来管理Flutter应用程序中的状态。本文将详细介绍Flutter Provider的使用,以及如何在MVVM架构中使用它。
155 0