Android中 将布局文件/View显示至手机屏幕的 整个过程分析

本文详细阐述了Android系统中窗口管理的核心概念,包括Window、PhoneWindow和DecorView类的作用及交互过程,揭示了如何通过这些类实现布局文件或View的添加至窗口的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下文中提到的窗口泛指我们所能看到的界面。例如,一个Activity呈现的界面,一个Dialog,一个Toast,一个Menu菜单等。

 

一、首先,对与该过程相关的类做一下介绍:

 

1.      Window类

位置:位于/frameworks/base/core/java/android/view/Window.java

简介:该类是抽象类,提供了一组绘制窗口的API。

      可以将其看作一个载体,各种view在这个载体上显示。

源码(部分):

public abstract class Window {      

//...

//指定Activity窗口的风格类型

    public static final int FEATURE_NO_TITLE =1;

    public static final intFEATURE_INDETERMINATE_PROGRESS = 5;

   

    //设置布局文件

    public abstract void setContentView(intlayoutResID);

 

    public abstract void setContentView(Viewview);

 

    //请求指定Activity窗口的风格类型

    public boolean requestFeature(intfeatureId) {

        final int flag = 1<<featureId;

        mFeatures |= flag;

        mLocalFeatures |=mContainer != null ? (flag&~mContainer.mFeatures) : flag;

        return (mFeatures&flag) != 0;

    }   

    //...

}


2.       PhoneWindow类

位置:/frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindow.java

 

简介:

该类继承了Window抽象类,是Window抽象类的具体实现,我们可以通过该类绘制窗口。

           该类内部有一个DecorView对象(Decor:装饰,布置。Decor View即修饰 视图,因为DecorView继承了FrameLayout并进行了一些功能扩展,后面将详细介绍)此DecView对象是所有应用窗口(Activity界面,即Layout布局)的View

           所以,形象点说,PhoneView类是一个包装机器,他把DecorView对象进行一定的包装,将它作为窗口的根View。并且,PhoneView还提供了一组通用的对窗口的操作接口。

 

源码:

public class PhoneWindow extends Window implements MenuBuilder.Callback {

//...

// This is the top-level view of the window, containing the windowdecor.

    private DecorViewmDecor;  //该对象是所有应用窗口的根视图 , 是FrameLayout的子类

   

    //该对象是Activity布局文件的父视图,一般来说是一个FrameLayout型的ViewGroup

    // 同时也是DecorView对象的一个子视图

    // This is the view in which the windowcontents are placed. It is either

    // mDecor itself, or a child of mDecorwhere the contents go.

    private ViewGroup mContentParent;

   

    //设置标题

    @Override

    public void setTitle(CharSequence title) {

        if (mTitleView != null) {

            mTitleView.setText(title);

        }

        mTitle = title;

    }

    //设置背景图片

    @Override

    public final voidsetBackgroundDrawable(Drawable drawable) {

        if (drawable != mBackgroundDrawable ||mBackgroundResource != 0) {

            mBackgroundResource = 0;

            mBackgroundDrawable = drawable;

            if (mDecor != null) {

               mDecor.setWindowBackground(drawable);

            }

        }

    }

    //...   

}


3.       DecorView类

位置:PhoneView的抽象类。

简介:所有应用窗口的根View,该类继承了FrameLayout对普通的FrameLayout类进行了功能的扩展(或者说是“修饰”,Decor:修饰,布置)。 比如说,添加标题栏(TitleBar)。

DecorView根视图

源码:

privatefinal class DecorView extends FrameLayout {

//...

//触摸事件处理

@Override

    public boolean onTouchEvent(MotionEventevent) {

        return onInterceptTouchEvent(event);

    }

//...

}




三类综述:

Window类是载体(胶卷),PhoneView类是包装机器(打印机),DecorView类是视图内容(照片的内容)。

确定了照片里的内容后(要打印什么),再确定照片的属性(尺寸,打印时间,打印地点等),最后将照片打印在胶卷上。

二、请待下回更新。

参考网站:Android中将布局文件或View添加至窗口过程分析

如果您下载了本程序,但是该程序存在问题无法运行,那么您可以选择退款或者寻求我们的帮助(如果找我们帮助的话,是需要追加额外费用的)。另外,您不会使用资源的话(这种情况不支持退款),也可以找我们帮助(需要追加额外费用) 结合了okHttp、volley、MaterialViewPager的基本使用方法,可以作为入门程序练手~ 随着移动互联网技术的发展和用户需求的变化,【小程序名称】应运而生,以其轻量化、便捷化的设计理念为用户提供了一种全新的服务模式。作为一款无需下载安装即可使用的应用,【小程序名称】依托于微信庞大的生态系统,让用户在微信内就能轻松实现各种功能操作。 【小程序名称】的核心功能主要集中在【具体服务领域】,例如在线购物、本地生活服务、教育学习或健康管理等。它简化了传统APP繁琐的注册登录流程,支持微信一键授权登录,极大地提升了用户体验。用户通过搜索或扫描二维码,瞬间即可开启使用,享受快速加载、流畅运行的服务。 该小程序界面设计简洁明了,布局合理,易于上手。同时,其特色功能如实时更新的信息推送、个性化推荐以及社交分享功能,让用户能够及时获取所需信息,并方便地将优质内容分享至朋友圈或好友,实现信息的高效传播与互动。 【小程序名称】注重数据安全与隐私保护,严格遵守国家法律法规和微信平台的规定,确保用户数据的安全无虞。此外,其背后的开发团队持续迭代更新,根据用户反馈不断优化产品性能,提升服务质量,致力于打造一个贴近用户需求、充满活力的小程序生态。 总结来说,【小程序名称】凭借其小巧便携、快捷高效的特性,不仅节省了用户的手机存储空间,更为用户提供了无缝衔接的便利服务,是现代生活中不可或缺的一部分,真正实现了“触手可及”的智能生活新体验。只需轻点屏幕,无限精彩尽在掌握之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

张之海

若有帮助,客官打赏一分吧

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

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

打赏作者

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

抵扣说明:

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

余额充值