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. 索引:拆…

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

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

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

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

分享免费的手机清理软件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…

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…

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

近日给深圳客户申请的商标初审下来了&#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…

UI控件与视图层次:探索界面的无限可能

[OC]UI学习笔记 文章目录 [OC]UI学习笔记视图和视图层次结构CGRectUILabelUIButtonUIView控件UIView的层级关系UIWindow定时器和视图移动UISwitch进度条和滑动条控件步进器和分栏控件警告对话框与等待指示器UITextField 视图和视图层次结构 Objective-C中的UI编程主要围绕视图…

C++的哈希 哈希表 哈希桶

目录 Unordered系列关联式容器 什么是哈希 哈希表 闭散列 载荷因子α 扩容 查找 删除 字符串哈希算法 最终代码 开散列 插入 查找 删除 最终代码 完整代码 Unordered系列关联式容器 C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0…

大学校园广播“录编播”与IP广播系统技术方案

一、项目概述 1、校园IP网络广播系统概述 大学校园广播系统是学校整个弱电系统中的子系统&#xff0c;它是每个学校不可缺少的基础设施之一&#xff0c;在传递校园文化、传播校园新闻资讯方面发挥着重要的作用。近几年来&#xff0c;虽然视频技术和网络技术在飞速发展&#xf…

行为设计模式之策略模式

文章目录 概述原理结构图 代码实现小结 概述 策略模式(strategy pattern)的原始定义是&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。 在软件开发中也会遇到相似的情况&…

基于双差分值和RR间隔处理的心电信号R峰检测算法(MATLAB R2018A)

心电信号中的R峰是确定心率和节律、以及检测其它波形特征点&#xff08;图1A&#xff09;的基础。R峰的准确检测是心率变异性分析、心拍分割和心律失常识别重要的处理步骤。 现有的心电信号R峰检测方法主要为基于规则的决策法和基于深度学习的检测方法。基于规则的决策法通常对…

中国低调海外巨头,实力超乎想象!

在全球化的浪潮中&#xff0c;中国公司正以前所未有的速度和规模走向世界。他们或许低调&#xff0c;但却实力非凡&#xff0c;在国际市场上掀起了一股不可小觑的“中国风暴”。今天&#xff0c;就让我们揭开那些在国外牛逼到爆炸的中国公司的神秘面纱&#xff0c;深度解析他们…

mysql中InnoDB的表空间--系统表空间

大家好。上篇文章我们讲了InnoDB的独立表空间&#xff0c;我们知道了表空间被划分为许多连续的区&#xff0c;对于大小为16KB的页面来说&#xff0c;每个区默认由64个页组成&#xff0c;每256个区为一组&#xff0c;每个组最开始的几个页的类型是固定的。&#xff08;在这里强烈…