Android 深入系统源码探讨 Activity、Window 和 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应用的用户界面和用户体验。

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

在这里插入图片描述

  • 170
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 204
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 204
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邓瑞军说HelloWorld

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值