Android 深入系统源码探讨 Activity、Window 和 View 的关系与实践

文章目录

    • 1、概括
    • 2、Android Window 设计
      • 2.1、Window 类
      • 2.2、PhoneWindow
      • 2.3、WindowManager
      • 2.4、ViewRootImpl
      • 2.5、DecorView
    • 3、Android Activity 设计
      • 3.1、Activity的基本概念
      • 3.2.、Activity的生命周期
      • 3.3、Activity的内部结构
    • 4、Android View 设计
      • 4.1、View的基本概念
      • 4.2、View的结构
    • 5、Activity、Window 和 View 之间的关系
      • 5.1、Activity 创建和 Window 初始
      • 5.2、设置内容视图
      • 5.3、DecorView
    • 6、关系总结

1、概括

在Android中,窗口(Window)是一个视图层次结构的顶级容器,它负责管理和展示应用的用户界面。每个Activity都有一个与之关联的Window对象,Activity通过这个Window来展示它的界面内容。理解Window的设计和工作原理对于开发复杂的Android应用程序是非常重要的。

2、Android Window 设计

2.1、Window 类

1、Window是一个抽象类,定义了窗口的通用行为。它的具体实现类是PhoneWindow。
2、Window类的主要职责包括设置视图内容、管理窗口特性(如标题栏、状态栏)、处理输入事件等。

2.2、PhoneWindow

1、PhoneWindow是Window的具体实现类,负责在Android手机设备上创建和管理窗口。
2、PhoneWindow对象通过Activity的attach方法在Activity启动时创建。

2.3、WindowManager

1、WindowManager是一个接口,用于管理窗口。它允许添加、更新和删除窗口。
2、WindowManagerImpl是WindowManager的具体实现类,通过它可以对窗口进行实际的操作。
3、WindowManager通过WindowManagerService与系统服务通信,实际管理窗口的添加和删除。

2.4、ViewRootImpl

1、ViewRootImpl是连接WindowManager和View层次结构的桥梁。它负责处理窗口的绘制和事件分发。
2、每个窗口都有一个对应的ViewRootImpl实例,它将窗口中的视图层次结构附加到窗口上,并处理输入事件和绘制。

2.5、DecorView

1、DecorView是应用窗口的顶级视图容器,包含了窗口的内容视图和标准窗口装饰(如标题栏、状态栏)。
2、在PhoneWindow中,通过setContentView方法将Activity的布局设置为DecorView的子视图。

3、Android Activity 设计

3.1、Activity的基本概念

Activity代表应用中的一个单独的屏幕。每个Activity包含用户可以与之交互的UI元素(如按钮、文本框等)。

3.2.、Activity的生命周期

Activity的生命周期是由一系列回调方法控制的,这些方法帮助开发者管理Activity的状态。主要的生命周期方法包括:

*onCreate(): Activity被创建时调用,用于初始化界面和数据。
*onStart(): Activity即将变得对用户可见时调用。
*onResume(): Activity即将开始与用户交互时调用。
*onPause(): 系统即将开始继续另一个Activity时调用,用于保存数据、停止动画等。
*onStop(): Activity即将变得对用户不可见时调用。
*onDestroy(): Activity即将被销毁时调用,用于清理资源。

3.3、Activity的内部结构

Activity继承自ContextThemeWrapper,它提供了应用程序环境和主题支持。Activity的内部结构包括以下关键部分:

3.1、Context
Activity是Context的子类,提供了应用环境的全局信息,包括资源访问、类加载、系统服务等。Activity通过Context可以访问应用的资源和其他系统服务。

3.2、Window
Activity关联了一个Window对象,用于管理屏幕上的UI。Android中Window的具体实现是PhoneWindow。PhoneWindow负责处理窗口的装饰和内容视图。

3.3、View
每个Activity都有一个根视图容器,通常是DecorView,它包含了窗口的内容视图和装饰视图。通过setContentView方法,开发者可以将布局资源设置为Activity的内容视图。

4、Android View 设计

在Android中,View是所有UI组件的基础类,它代表了屏幕上的一个矩形区域,可以绘制内容和处理用户交互。View类是Android视图层次结构的核心部分,理解View的设计和工作原理对开发自定义UI组件和优化应用性能非常重要。

4.1、View的基本概念

View是一个抽象类,所有UI组件(如按钮、文本框、图像)都直接或间接地继承自View。View类负责处理绘制、布局和用户交互等基本操作。

4.2、View的结构

View类的结构主要包括以下几个方面:
1、绘制(Drawing): 负责将内容绘制到屏幕上。
2、布局(Layout): 负责测量和定位自身以及其子视图(如果是ViewGroup)。
3、事件处理(Event Handling): 负责处理用户输入事件(如触摸、点击)。

5、Activity、Window 和 View 之间的关系

5.1、Activity 创建和 Window 初始

当Activity启动时,系统会创建一个与之关联的 PhoneWindow 对象:

public class Activity extends ContextThemeWrapper {final void attach(Context context, ActivityThread aThread, Instrumentation instr, IBinder token, int ident,Application application, Intent intent, ActivityInfo info, CharSequence title, Activity parent, String id,NonConfigurationInstances lastNonConfigurationInstances, Configuration config, String referrer,IVoiceInteractor voiceInteractor, Window window) {attachBaseContext(context);mWindow = new PhoneWindow(this);mWindow.setCallback(this);mWindow.setWindowManager((WindowManager) context.getSystemService(Context.WINDOW_SERVICE), mToken, mComponent.flattenToShortString(), (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);}
}

5.2、设置内容视图

当调用 Activity 的 setContentView 方法时,实际上是在设置 PhoneWindow 的内容视图

public class Activity extends ContextThemeWrapper {public void setContentView(int layoutResID) {getWindow().setContentView(layoutResID);}
}

PhoneWindow 的 setContentView 方法负责将布局资源解析成 View 对象,并添加到 DecorView 中:

public class PhoneWindow extends Window {@Overridepublic void setContentView(int layoutResID) {if (mContentParent == null) {installDecor();} else {mContentParent.removeAllViews();}mLayoutInflater.inflate(layoutResID, mContentParent);mContentParent.requestApplyInsets();}private void installDecor() {if (mDecor == null) {mDecor = generateDecor();mContentParent = generateLayout(mDecor);}}
}

系统源代码如下:
在这里插入图片描述

5.3、DecorView

1、 DecorView 是 PhoneWindow 的顶级视图容器 ,包含了窗口的内容视图和标准窗口装饰(如标题栏、状态栏)。
2、PhoneWindow 通过 generateDecor 方法创建 DecorView,并通过 generateLayout 方法将内容视图添加到 DecorView 中:

protected DecorView generateDecor() {return new DecorView(getContext(), -1);
}protected ViewGroup generateLayout(DecorView decor) {ViewGroup contentParent = (ViewGroup) mLayoutInflater.inflate(R.layout.screen_simple, null);decor.addView(contentParent, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));return contentParent;
}

系统源代码如下:
在这里插入图片描述
DecorView继承自FrameLayout,它是整个窗口内容的根视图,位于视图层次结构的最顶层。每个Activity都有一个DecorView

6、关系总结

6.1、Activity 创建并管理一个 PhoneWindow 对象。

6.2、PhoneWindow 是 Window 的具体实现,负责管理窗口的视图和装饰。

6.3、PhoneWindow 通过 DecorView 容纳内容视图。

6.4、Activity 的布局文件通过 setContentView 方法设置到 PhoneWindow,并最终成为 DecorView 的子视图。

6.5、ViewRootImpl 连接窗口管理器(WindowManager)和视图层次结构,负责窗口的绘制和输入事件处理。

具体代码流程示例
以下是一个简单的Activity示例,展示了上述关系:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 设置Activity的内容视图setContentView(R.layout.activity_main)}
}

1、当 MainActivity 启动时,系统会创建一个 PhoneWindow 对象并与该 Activity 关联。
2、调用 setContentView(R.layout.activity_main) 会将 activity_main 布局资源解析成 View 对象,并添加到 PhoneWindow 的 DecorView 中。
3、ViewRootImpl 负责处理该窗口的绘制和输入事件。

关系图

通过理解Activity、Window和View之间的关系,可以更好地设计和优化Android应用的用户界面和用户体验。

欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

在这里插入图片描述

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

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

相关文章

LangChain 0.2 - 构建RAG应用

本文翻译整理自:Build a Retrieval Augmented Generation (RAG) App https://python.langchain.com/v0.2/docs/tutorials/rag/ 文章目录 一、项目说明什么是 RAG ?概念索引检索和[生成 二、预览三、详细演练1.索引:加载2. 索引:拆…

C++中的类型查询:探索typeid和type_info

前言 在编程的世界里,了解和操作数据类型是至关重要的。Python 通过内置的 type() 函数提供了一种简单的方式来查询变量的类型。然而,在 C 这种静态类型语言中,类型信息通常是在编译时就已经确定的。尽管如此,C 标准库还是提供了…

陈丽:人工智能赋能教育创新发展

5月20日,在顾明远先生莅临科大讯飞考察指导高端咨询会暨“人工智能与未来教育”的主题研讨会上,北京师范大学原副校长、中国教育技术协会副会长陈丽教授作了题为《人工智能赋能教育创新发展》的主旨报告。 (以下内容根据陈丽教授在研讨会上的…

期权课程之第三节【什么是ITM,ATM,OTM】

我们可以根据正股行权价和股价关系 对期权进行一个分类 ITM 全称为In-the-money&#xff1a;行权后可以获得收益的期权 根据call和put &#xff0c;又可以分为两类 ITM call &#xff1a; 行权价< 股价 &#xff0c;IMT Put &#xff1a;行权价>股价 比如这个时候&a…

React 中的响应时间详解

使用 React 可以在 JSX 中添加 事件处理函数。其中事件处理函数为自定义函数&#xff0c;它将在响应交互&#xff08;如点击、悬停、表单输入框获得焦点等&#xff09;时触发。 添加事件处理函数 如需添加一个事件处理函数&#xff0c;你需要先定义一个函数&#xff0c;然后…

如何使用性能监控工具分析JVM性能瓶颈

1、jConsole&#xff1a; jConsole是JDK自带的Java监控和管理控制台。它提供了一个图形用户界面&#xff08;GUI&#xff09;&#xff0c;用于监控和管理Java应用程序的性能和资源消耗。 使用方法&#xff1a;打开jdk\bin\jconsole.exe&#xff0c;连接到正在运行的Java进程&a…

第十一章:C# 判断

判断语句是控制程序执行流程的基础,用于根据条件执行不同的代码块。C#提供了多种判断语句,包括if语句、if-else语句、else-if语句和switch语句。掌握这些判断语句有助于编写具有逻辑判断能力的程序。 1. if 语句 if语句用于根据条件执行特定的代码块。如果条件为真(true)…

分享免费的手机清理软件app,一款国外开发的手机清理神器,让手机再战两年!

手机内存越来越大&#xff0c;软件却越来越占地方&#xff0c;就像微信这家伙&#xff0c;轻轻松松就吃了十几个G&#xff01; 害得阿星8128G的手机&#xff0c;本来想换新的&#xff0c;结果用了这款Avast Cleanup软件&#xff0c;瞬间感觉手机还能再战两年&#xff01; 注意…

云上聚智共创未来 | 移动云的项目实战,10分钟让你获得高度可玩的个人博客网站

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 随着互联网的发展各种以前看起来离我们比较遥远的词越来越近了&#xff0c;比如 云服务、大数据、区块链、容器这些听起来…

VMware ESXi 7.0U3q macOS Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版) ESXi 7 U3 标准版集成 Intel 网卡、Realtek USB 网卡 和 NVMe 驱动 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-7-u3-sysin/&#xff0c;查看最新版。原创作品…

Android network — 进程指定网络发包

Android network — 进程指定网络发包 0. 前言1. 进程绑定网络1.1 App进程绑定网络1.2 Native进程绑定网络 2. 源码原理分析2.1 申请网络requestNetwork2.2 绑定网络 BindProcessToNetwork 3. 总结 0. 前言 在android 中&#xff0c;一个app使用网络&#xff0c;需要在manifest…

uniapp+vue3小程序版后台管理|uniapp小程序后台OA应用

基于uni-appvue3piniauni-ui等技术构建小程序版后台管理系统UniVue3Admin。实现了栅格化卡片布局引擎、多屏滑动管理、自定义桌面壁纸/小部件、内置常用表格/表单/编辑器及图表等功能。 uniappvite5pinia2跨端仿ios后台OA模板【小程序版】 uni-vue3-wechat基于vue3uniapp高仿微…

X-CSV-Reader:一个使用Rust实现CSV命令行读取器

&#x1f388;效果演示 ⚡️快速上手 依赖导入&#xff1a; cargo add csv读取实现&#xff1a; use std::error::Error; use std::fs::File; use std::path::Path;fn read_csv<P: AsRef<Path>>(filename: P) -> Result<(), Box<dyn Error>> {le…

【Java面试】二、Redis篇(中)

文章目录 1、Redis持久化1.1 RDB1.2 AOF1.3 RDB与AOF的对比 2、数据过期策略&#xff08;删除策略&#xff09;2.1 惰性删除2.2 定期删除 3、数据淘汰策略4、主从复制4.1 主从全量同步4.2 增量同步 5、哨兵模式5.1 服务状态监控5.2 哨兵选主规则5.3 哨兵模式下&#xff0c;Redi…

css初体验

简介 css用于定义网页样式,包括针对不同设备和屏幕尺寸的设计和布局。 语法:由选择器和声明组成。 选择器指向您需要设置样式的 HTML 元素。 声明块包含一条或多条用分号分隔的声明。 css使用方法 1.外部css, 使用最多,就是创建一个后缀为.css 的文件,在html文件中…

爬山算法介绍

目录 1.概述 2.产生 3.定义 4.优缺点 5.应用示例 6.未来展望 7.示例代码 1.概述 爬山算法是一种简单的启发式搜索算法&#xff0c;从起始点开始&#xff0c;每次选择当前位置邻域内的最优解作为下一个位置&#xff0c;直到达到目标点或无法继续前进。爬山算法的基本思想…

商标注册申请名称的概率,多想名称选通过率好的!

近日给深圳客户申请的商标初审下来了&#xff0c;两个类别都下的初审&#xff0c;和当初的判断基本一致&#xff0c;普推知产老杨当时沟通说需要做担保申请注册也可以&#xff0c;后面选择了管家注册&#xff0c;最近大量的帮客户检索商标名称&#xff0c;分享下经验。 两个字基…

【PB案例学习笔记】-09滚动条使用

写在前面 这是PB案例学习笔记系列文章的第8篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gitee…

新书推荐:7.1 do while语句

本节必须掌握的知识点&#xff1a; 示例二十二 代码分析 汇编解析 ■do while语句其语法形式&#xff1a; do{ 语句块; }while(表达式) ■语法解析&#xff1a; ●执行do循环体内的语句块&#xff1b; ●判断while语句里的表达式&#xff0c;表达式为真继续下次循环&#…

stm32学习-串口收发(HEX/文本)数据包

串口收发HEX数据包 接线 TXDPA10RXDPA9按键PB1 配置流程 定义为固定包长&#xff0c;含包头包尾&#xff08;其中包头为0xFF&#xff0c;载荷数据固定为4字节&#xff0c;包围为0xFE&#xff09; 注意&#xff1a;固定包长/可变包长&#xff0c;或者包头包围是什么&#xf…