首页 > 编程语言 >Android 深入系统源码探讨 Activity、Window 和 View 的关系与实践

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

时间:2024-05-27 12:01:35浏览次数:26  
标签:PhoneWindow 视图 DecorView Window 源码 Activity View

文章目录

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应用的用户界面和用户体验。

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

在这里插入图片描述

标签:PhoneWindow,视图,DecorView,Window,源码,Activity,View
From: https://blog.csdn.net/rjdeng/article/details/139087570

相关文章

  • windows下mysql修改表名大消息参数lower_case_table_names,需要initialize才生效
    第一步:尝试修改文件my.ini,发现改了重启不管用:C:\ProgramFiles\MySQL\MySQLServer8.0\bin>notepadmy.ini[mysqld]lower_case_table_names=2 第二步:尝试初始化mysql服务,带上参数。注意,会清空数据库,所以务必先备份数据!!!参考:https://blog.csdn.net/cccgo68/article/d......
  • 1915springboot VUE 宠物寄养平台系统开发mysql数据库web结构java编程计算机网页源码m
    一、源码特点 springbootVUE宠物寄养平台系统是一套完善的完整信息管理类型系统,结合springboot框架和VUE完成本系统,对理解JSPjava编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用B/S模式开发。springbootVUE宠物寄养......
  • 翻译《The Old New Thing》- Hotkeys involving the Windows logo key are reserved b
    HotkeysinvolvingtheWindowslogokeyarereservedbythesystem-TheOldNewThing(microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071130-00/?p=24333RaymondChen 2007年11月30日Windows徽标键的热键由系统保留        系统保留了......
  • 了解 HTML 中的window、document、body和元素的尺寸及位置
    本文将详细介绍与窗口(window)、文档(document)、主体(body)以及其他HTML元素的尺寸和位置相关的属性及方法。每个部分将包含示例和代码注释,帮助您更好地理解和应用这些知识。window对象尺寸属性1.window.innerWidth和window.innerHeightwindow.innerWidth和window.inn......
  • Windows下安装配置深度学习环境
    Windows下安装配置深度学习环境1.准备工作1.1环境准备操作系统:win1022H2GPU:NvidiaGeForceRTX306012G1.2安装Nvidia驱动、cuda、cuDNN下载驱动需要注册并登录英伟达账号。我这里将下面用到的安装包放到了百度网盘,可以关注微信公众号思......
  • Java项目-基于springboot+vue的旅游管理系统(源码+数据库+文档)​
    如需完整项目,请私信博主基于SpringBoot+Vue的旅游管理系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven随着科学技术的飞速发展,网络快速发展、人民生活的快节奏都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,旅游管......
  • Java项目-基于springboot+vue的简历系统(源码+数据库+文档)​
    如需完整项目,请私信博主基于SpringBoot+Vue的简历系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,简历系统当然也不......
  • 异构数据源同步之数据同步 → datax 再改造,开始触及源码
    开心一刻其实追女生,没那么复杂只要你花心思,花时间,陪她聊天,带她吃好吃的,耍好玩的,买好看的慢慢你就会发现什么叫做打水漂不说了,我要去陪她看电影了前情回顾异构数据源同步之数据同步→datax改造,有点意思主要讲到了2点去Python,直接在命令行用java命令来启动通过......
  • 源码编译安装LAMP
    1、LAMPLAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词,具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP(或Perl、Python)网页编程语言。各组件的作用(平台)Li......
  • Dubbo阅读源码记录
    1.Protocal:默认dubbo协议,默认端口208802.zk作为注册中心,创建接口下的consumer/provider/configurator/router节点是持久话节点。此四个节点下的节点是临时节点,会话心跳检测不到节点信息,就会自动删除3.@enabledubbo:扫描@service和@reference注解4.dubbo重试次数可以通过xm......