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

news2024/11/16 13:49:20

文章目录

    • 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 {
    @Override
    public 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.coloradmin.cn/o/1700439.html

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

相关文章

构建智慧城市公共服务系统的功能架构设计

随着城市化进程的加速,城市公共服务系统在保障居民生活品质、提升城市管理水平方面扮演着愈发重要的角色。构建智慧城市公共服务系统的功能架构设计至关重要,它不仅需要充分考虑居民需求与城市管理的实际情况,还需要整合先进的科技手段&#…

vue3快速入门(局部使用)

目录 前置知识JavaScript-导入导出 入门操作 变量渲染页面 局部使用vue的实现步骤 vue指令 v-for v-bind v-if v-show v-on v-model 生命周期 前置知识JavaScript-导入导出 正常情况在html导入js文件是全部导入,这样会导致性能上的损失 。 JS提供的…

Docker之xfs文件系统下安装报错解决方案

一、需求说明 centos系统下安装docker最新版的时候,安装成功,启动的时候报错。报错信息“failed to start daemon: error initializing graphdriver: overlay2: the backing xfs filesystem is formatted without d_type support, which leads to incorr…

5.26机器人基础-DH参数 正解

1.建立DH坐标系 1.确定Zi轴(关节轴) 2.确定基础坐标系 3.确定Xi方向(垂直于zi和zi1的平面) 4.完全确定各个坐标系 例子: 坐标系的布局是由个人决定的,可以有不同的选择 标准坐标系布局: …

NDIS协议驱动(一)

Microsoft Windows 操作系统使用基于 1978 年国际标准化组织 (ISO) 开发的七层网络模型的网络体系结构。 ISO 开放系统互连 (OSI) 参考模型将网络描述为“一系列协议层,具有分配给每个层的一组特定函数。 每个层都向更高层提供特定的服务,同时阻止这些层…

vscode:如何解决”检测到include错误,请更新includePath“

vscode:如何解决”检测到include错误,请更新includePath“ 前言解决办法1 获取includePath路径2 将includePath路径添加到指定文件3 保存 前言 配置vscode是出现如下错误: 解决办法 1 获取includePath路径 通过cmd打开终端,输入如下指令&a…

有个小伙把 MyBatis 替换成 MyBatis-Plus,上线后就被开了!!

MyBatis-Plus 替换 MyBatis 首先,我们准备了一张名为 tbl_order 的表,并初始化了其中的两条数据。 DROP TABLE IF EXISTS tbl_order; CREATE TABLE tbl_order (id bigint(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 自增主键,order_no varchar(50)…

云易办springboot+vue后端

springbootvue云易办后端项目完成 一.创建项目 创建父项目&#xff1a;yeb&#xff0c; 使用spring Initializr&#xff0c;完成创建之后删除无用文件夹&#xff0c;作为父项目 添加packaging <packaging>pom</packaging>二.创建子模块&#xff1a;yeb-server …

这或许是国产游戏出海的最佳时机

《刺客信条&#xff1a;影》过于政治正确的选角激怒了全球玩家&#xff0c;而社交媒体上有玩家讨论育碧是否应该因为刻意加入DEI&#xff08;多元化&#xff09;而延期《刺客信条&#xff1a;影》时&#xff0c;没想到这得到了X拥有人埃隆马斯克的回复。马斯克表示“DEI&#x…

内网穿透实现公网访问自己搭建的Ollma架构的AI服务器

内网穿透实现公网访问自己搭建的Ollma架构的AI服务器 [2024年5月9号我发布一个博文关于搭建本地AI服务器的博文][https://blog.csdn.net/weixin_41905135/article/details/138588043?spm1001.2014.3001.5501]&#xff0c;今天我们内网穿透实现从公网访问我的本地AI服务器&…

【深度学习】最强算法之:人工神经网络(ANN)

人工神经网络ANN 1、引言2、人工神经网络(ANN)2.1 定义2.1.1 定义2.1.2 应用场景 2.2 核心原理2.3 实现方式2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;看新闻没&#xff1f; 小鱼&#xff1a;新闻天天看&#xff0c;啥事大惊小怪的。 小屌…

C++干货 --类和对象(二)

前言&#xff1a; 上文中&#xff0c;我们介绍了类这一重要知识点&#xff0c;包括为什么要有类、类的使用方法、封装、以及对象实例化。详情可以去看我的文章&#xff1a;写文章-CSDN创作中心C干货 --类和对象(一)-CSDN博客写文章-CSDN创作中心 这篇文章&#xff0c;我们简单…

全球点赞最高的人颜廷利:真正的人生目标是什么

在那个充满生机的2024年春天&#xff0c;记者有幸对中国第一起名大师的老师颜廷利教授进行了深入的访谈。带着对其人生哲学的强烈好奇&#xff0c;记者紧张而期待地提出了问题&#xff1a;“颜教授&#xff0c;您在漫长的人生旅途中最追求的是什么&#xff1f;” 宁夏银川、山东…

【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

文盘Rust -- 生命周期问题引发的 static hashmap 锁

100编程书屋_孔夫子旧书网 2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了。项目地址:https://github.com/jiashiwen/interactcli-rs。 春节以前看到axum已经0.4.x了,于是想看看能不能用rust做个服务端的框架。 春节…

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

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

浅谈Docker容器的网络通信原理

文章目录 1、回顾容器概念2、容器网络3、容器与主机之间的网络连通4、交换机的虚拟实现---虚拟网桥&#xff08;Bridge&#xff09;5、Docker 守护进程daemon管理容器网络 1、回顾容器概念 我们知道容器允许我们在同一台宿主机&#xff08;电脑&#xff09;上运行多个服务&…

【蓝桥杯省赛真题44】python计算N+N的值 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析

目录 python计算NN的值 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python计算NN的值 第十四届蓝桥杯青少年组python省赛真题 一、题目要求…

VMware安装Ubuntu系统(超详细)

一.Ubuntu官网下载镜像 Ubuntu官网&#xff1a;Enterprise Open Source and Linux | Ubuntu 二.安装Ubuntu系统 选择文件->创建虚拟机新建虚拟机&#xff08;ControlN&#xff09;&#xff0c;这里直接选择典型即可 选择稍后安装系统 选择linux Ubuntu 64位 填写虚拟机名称…

PanTools v1.0.25 多网盘批量管理工具 批量管理、分享、转存、重命名、复制...

一款针对多个热门网盘的文件管理、批量分享、批量转存、批量复制、批量重命名、批量链接检测、跨账号移动文件、多账号文件搜索等&#xff0c;支持不同网盘的不同账号的资源文件操作。适用于网站站长、资源爱好者等&#xff0c;对于管理名下具有多个网盘多个账号具有实用的效果…