View,Activity,Window三者的关系

Android-Framework: Activity、Window、View三者之间的关系 Android-Framework: Activity、Window、View三者之间的关系 文章目录Android-Framework: Activity、Window、View三者之间的关系前言Window对象是什么时候创建的?总结参考 前言 Activity、View 做过Android开发的都比较熟悉一个是Android的四大组件、一个是用于展示各种控件的View,相对于前两者 Window 在日常开发中比较陌生,今天我们这篇文章就将这三个问题讲清楚。 Window对象是什么时候创建的? 要想弄清楚 阅读详情
    在Activity中,通过setContentView就可以显示xml的布局文件了,也就是把一个个View控件组合在一起,首先,这个Activity的方法setContentView有三个重载的方法。
    
public void setContentView(int layoutResID) {
        getWindow().setContentView(layoutResID);
    }
    public void setContentView(View view) {
        getWindow().setContentView(view);
    }
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        getWindow().setContentView(view, params);
    }
    
    可以看出,三个方法什么也没用做,只是调用了getWindw方法。看一下getWindow方法,仅仅是
      
  public Window getWindow() {
        return mWindow;
    }

    mWindwow是在attach方法中创建的,看一看attach方法。有这两行代码
  
  mWindow = PolicyManager.makeNewWindow(this);
    mWindow.setCallback(this);

首先,看看PolicyManager.makeNewWindow(this)是如何处理的。
//通过反射的方式,创建一个Ipolicy的实例对象。
    public final class PolicyManager {  
    private static final String POLICY_IMPL_CLASS_NAME =  
        "com.android.internal.policy.impl.Policy";  
  
    private static final IPolicy sPolicy;  
  
    static {  
       // 运行时动态装载IPolicy实现类   
        try {  
           //加载Policy类的同时会执行其中的静态代码段   
            Class policyClass = Class.forName(POLICY_IMPL_CLASS_NAME);  
            sPolicy = (IPolicy)policyClass.newInstance();  
        } catch (ClassNotFoundException ex) {  
            throw new RuntimeException(  
                    POLICY_IMPL_CLASS_NAME + " could not be loaded", ex);  
        } catch (InstantiationException ex) {  
            throw new RuntimeException(  
                    POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex);  
        } catch (IllegalAccessException ex) {  
            throw new RuntimeException(  
                    POLICY_IMPL_CLASS_NAME + " could not be instantiated", ex);  
        }  
    }  
  
    // 构造函数私有,保证是单例类   
    private PolicyManager() {}  
  
    // The static methods to spawn new policy-specific objects   
    public static Window makeNewWindow(Context context) {  
        //看看Policy的方法如何产生一个Window的。
        return sPolicy.makeNewWindow(context);  
    }  
  
    public static LayoutInflater makeNewLayoutInflater(Context context) {  
        return sPolicy.makeNewLayoutInflater(context);  
    }  
  
    public static WindowManagerPolicy makeNewWindowManager() {  
        return sPolicy.makeNewWindowManager();  
    }  
} 

查看Policy源码会发现,是new了一个PhoneWindow的实例。那么getWindow返回的就是一个PhoneWindow了。里面肯定也有三个setContentView方法了。

    
public void setContentView(int layoutResID){
        //mContentParent其实就是我们的xml布局显示的ViewGroup,是一个FlameLayout。
        //第一次,为null,就会执行,以后,会首先移除子View。
        if(mContentParent == null){
            installDecor();
        } else{
            mContentParent.removeAllViews();
            //这个方法什么事情也没用做。
            updateInflateParams();
        }
        //加载xml布局到mContentParent中,所以,我们可以猜想installDecor();肯定是可以得到一个mContentParent的。
        mViewInflate.inflate(layoutResID, mContentParent, mInflateParams);
        
        在Activity的attach方法中,还记得我们执行了一句mWindow.setCallback(this);由此看见,这个cb就是这个Activity自己。当Activity发生变化,就会执行onContentChanged方法。
        android.view.Window.Callback cb = getCallback();
        if(cb != null)
            cb.onContentChanged();
    }

查看installDecor方法

      
private void installDecor() {
        if (mDecor == null) {
            /*创建一个DecorView,
                private final class DecorView extends FrameLayout
            */
            mDecor = generateDecor();
            mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
            mDecor.setIsRootNamespace(true);
            if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures != 0) {
                mDecor.postOnAnimation(mInvalidatePanelMenuRunnable);
            }
        }
        if (mContentParent == null) {
            //根据窗口的风格修饰,选择对应的修饰布局文件,并且将id为content的FrameLayout赋值给mContentParent
            mContentParent = generateLayout(mDecor);
            //......
            //初始化一堆属性值
        }
    }
    
看一下如果mContentParent为null的时候,如何进行的。

protected ViewGroup generateLayout(DecorView decor){
        ......
        根据flag,style等属性获取到layoutResource,其实就是一个xml布局。这个布局分两块,
        LinearLayout
            FlameLayout(title)
            FlameLayout(content)这个其实就是我们的xml布局填充的父View。
        ......


        View in = mViewInflate.inflate(layoutResource, null, mInflateParams);
        decor.addView(in, new android.view.ViewGroup.LayoutParams(-1, -1));
        ViewGroup contentParent = (ViewGroup)findViewById(0x1050000);
        if(contentParent == null)
            throw new RuntimeException("Window couldn't find content container view");
    
        return contentParent;
    }
    
    根据上面的分析,可以知道setContentView都做了哪些事情。
    1:获得PhoneWindow对象。
    2:判断是否存在mContentParent,不存在的话就安装一个decorView,作为整个界面的根布局,里面有一个FlameLayout,其实就是mContentParent,而我们setContentView,把xml或者View作为mContentParent的子View来处理。
    
3A之自动对焦(AF)算法:从Tenegrad到拉普拉斯的清晰度评价实战 本文深入解析自动对焦(AF)算法的核心——清晰度评价函数,通过实战对比Tenegrad、方差、能量梯度、Brenner和拉普拉斯五大经典算法的原理、代码实现与性能。文章详细阐述了各函数在计算速度、抗噪性和单峰性上的优劣,并提供了从仿真测试到硬件部署的优化策略,帮助开发者根据实际场景选择最合适的AF算法。 阅读详情

相关推荐

千兆以太网的接收和crc校验

解析该以太网帧,包括统计该以太网帧长度+过滤功能(端口号对不对,是否为udp协议)+CRC校验,将解析结果存入状态fifo,一旦状态fifo开始有数,就开始开启读过程,读过程开始时,首先读状态fifo,根据从状态fifo里面读出的以太网帧长度,来读数据fifo(这样能够防止跨帧读),然后在根据状态fifo里面读出的crc校验正确标志和过滤标志,来确定是否将数据fifo读出来的数据送给下一个模块。改掉之后在抓一下,可以看到抓出来的数据完全正确,从最后开始看,除去4个crc校验的尾巴,数据是到255结束的。

weixin_45284871的博客 2739

Android滑动冲突解决方法

现阶段你以为过不去的事,天大的事,当过去以后就会发现那只是屁大点事。实际上,也真的只是屁大点事儿。所有发生的都是应当发生的,无论是对是错。你需要为自己所做的任何决定和选择进行承担和负责。你需要做的是不断充实自己,做自己喜欢做的事情,让自己忙碌起来。你要感谢所有的人,所有人的到来,都是为了增加你感情的丰富程度,教会你如何处世如何为人,是他们让你波澜不惊的生活起了波澜,给你的生活增添了色彩,你会感激你

nicolelili1的专栏 1627

EMQX 结合MySQL实现精细化ACL权限管理实战

本文详细介绍了如何通过EMQX结合MySQL实现精细化的ACL权限管理,提升物联网设备接入和消息传输的安全性。内容包括环境准备、基础配置、权限规则设计技巧以及高级应用与性能优化方案,帮助开发者快速掌握动态生效、便于管理的权限控制方法。

weixin_28683689的博客 197

setContentView源码分析

转载请注明出处: 在Activity中,常常第一件事就是在onCreate里面调用setContentView来设置布局。大家都知道setContentView用来设置Activity的布局,但是有没有研究过setContentView究竟做了哪些事呢?本文就一起看看setContentView是如何加载我们的布局的。看完之后大家就会知道为什么使用requestWindowFeature设置窗口

fishle123的专栏 1395

大模型应用开发面试全流程实录:RAG、上下文工程与多Agent协作技术深度解析

Transformer 依靠多头自注意力和位置编码实现高效序列建模。Prompt Engineering包含多种设计思路,如 Zero-shot、Few-shot、Chain-of-thought,提升模型泛化和推理。Token 和上下文窗口直接影响模型性能与成本,选择需结合实际业务场景(如客服对话需长窗口)。Embedding 技术是 RAG 的基础,决定了语义检索效果。向量数据库如 FAISS、Milvus等分别适用于本地/分布式检索。

m0_52114506的博客 828

别再折腾环境了!Windows 11 + VSCode + CMake 3.31.4 + MinGW-w64 一键式配置指南(附常见报错解决)

本文提供Windows 11下VSCode、CMake 3.31.4和MinGW-w64的一键式配置指南,帮助开发者快速搭建高效C++开发环境。涵盖工具链选型、环境变量配置、项目初始化及常见报错解决方案,大幅提升开发效率。

weixin_28841265的博客 186

【android java.lang.RuntimeException闪退,报错android.view.InflateException分析错误原因及解决方案】

添加图片控件后调试直接闪退,报错java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.recanapp/com.example.recanapp.MainActivity}: android.view.InflateException:最后是因为图片格式不对

安卓开发工程师 1383

直流电源滤波电路的设计与优化:从基础原理到高效应用

本文深入探讨直流电源滤波电路的设计与优化,从基础原理到高效应用全面解析。重点介绍电容滤波和电感滤波的工作原理及实战设计要点,分享复合滤波电路的进阶技巧,并提供常见问题排查指南。文章还涵盖现代滤波技术的新发展,如有源滤波和数字控制滤波的应用,帮助工程师提升电源系统的稳定性和效率。

weixin_29255731的博客 175

文件管理搜不到Android 里的文件,Android:在原始文件夹中添加文件后窗口找不到内容容器视图...

正在获取窗口找不到内容容器视图。这个错误询问应用程序何时将检查权限Android:在原始文件夹中添加文件后窗口找不到内容容器视图我注意到,对于穿着应用程序,我正在将穿着apk复制到原始文件夹中。它有大约2.5 Mb。添加这个我得到这次崩溃java.lang.RuntimeException: Window couldn't find content container viewat com.and...

weixin_39930276的博客 948

IEEE论文接收后,收到Proof邮件别慌!手把手教你48小时内搞定校样(附详细截图)

本文详细解析了IEEE论文接收后Proof校样的全流程,从邮件关键信息解码到精准修改标注,提供48小时内高效完成校样的实战指南。涵盖登录技巧、文件验证、修改标注黄金法则及九宫格检查清单,帮助作者避免常见错误,确保论文顺利发表。

weixin_30652491的博客 563

Arduino与震动马达模块握手

震动马达模块采用采用高品质手机震动马达,适用于震动感互动产品的制作,可穿戴智能设备震动提醒,适合作为非可听指示器的小型振动马达。当输入为高电平时电动机会震动,就像你的静音模式的手机一样。

vor234的博客 5847

从源码探索Activity布局加载过程

众所周知,Activity是承载布局的重要组件,是通过setContentView()方法来设置xml布局文件的,那么我们来提出几个问题 1.布局文件到底是怎么加载到Activity并显示到屏幕的呢? 2.我们给activity设置了主题,它对应的样式代码是在哪设置的呢? 下面我们跟踪源码来探索一下。 首先,我们点开setContentView()方法 publi...

qq_27246079的博客 408

【Python音频处理】syncstart 计算媒体文件同步时间偏移

syncstart是一个强大的工具,它简化了多媒体文件的音视频同步过程,特别适用于多设备录制的媒体内容。在使用命令行工具时,可以根据实际需求灵活调整参数,如归一化、降噪、低通滤波等,以提高同步的精度和效率。通过本文介绍的基本操作和应用示例,可以快速掌握syncstart的使用方法,并将其应用到日常的音视频处理工作中。

Mr数据杨 816

Android 深入了解 Window 、Activity、 View 三者关系

Window、Activity、View都经常用到,但三者关系还是没有系统的理清,今天咱们就开始整理整理这三者的关系: Window:顶级窗口外观和行为策略的抽象基类。唯一实现是 PhoneWindow类。 Activity:四大组件之一,它提供一个界面让用户点击和各种滑动操作。 View:代表用户界面组件的基本构建块,UI 组件。 源码:Android SDK 30 Activity.setContentView ...

帅次的博客 5000

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Activity Window View 三者之间的关系

问题引入 代码写久了发现有些问题,到底那些view时怎么显示在屏幕上的,怎么显示在window上的,还有我们刚开始学习android时候,每次新建一个Activity,在onCreate方法中都会使用setContentView这个方法传递一个布局,它又是怎么显示到屏幕上的呢? 首先Actiivity就是创建了一个Window,Activity实际就是Context的一个子类,Contex...

程序员成长指北 1161

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Window 、Activity、 View 三者关系

ps:文中源码为API 28 经常听到和用到Window,Window到底是什么? 简单概括三者关系 View其实是Android中视图的呈现方式,它必须附着在Window这个抽象的概念上,因此有视图的地方就有Window。有视图的地方不仅仅有Activity,还有Dialog、Toast,除此之外还有一些依托Window实现的视图:PopupWindow、菜单,它们也是视图,有视图的地方就有Window。因此Activity、Dialog、Toast都对应着一个Window。 三者各自创建时机 这里是.

潇风寒月 585

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Activity、Window、View三者关系

目录介绍 01.Window,View,子Window 02.什么是Activity 03.什么是Window 04.什么是DecorView 05.什么是View 06.关系结构图 07.Window创建过程 08.创建机制分析 8.1 Activity实例的创建 8.2 Activity中Window的创建 8.3 DecorView的创建 弹窗系列博客 01.Activity、W...

weixin_33882452的博客 253

Android的Activity Window和View三者之间的关系解析

我们知道,Activity是安卓的四大组件之一,负责手机界面的展示和交互。那么他与Window和View是什么关系呢。 下面,我们看一个简单的界面:它的布局文件如下,很简单:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

帅风的专栏 2416

Activity Window View 三者的关系

Activity Window View 三者的关系 1、在Activity中调用attach,创建了一个Window 2、创建的window是其子类PhoneWindow,在attach中创建PhoneWindow 3、在Activity中调用setContentView(R.layout.xxx) 4、其中实际上是调用的getWindow().setContentView() 5、调用PhoneWindow中的setContentView方法 6、...

zjxwon的博客 267

文化袁探索专栏——Activity、Window和View三者间关系

文化袁探索专栏——Activity、Window和View三者间关系 文化袁探索专栏——View三大流程#Measure 文化袁探索专栏——View三大流程#Layout 文化袁探索专栏——Handler消息分发机制 文化袁探索专栏——事件分发机制 文化袁探索专栏——Launcher进程启动流程 文化袁探索专栏——Activity启动流程 文化袁探索专栏——APP进程启动流程 文化袁探索专栏——自定义View实现细节 文化袁探索专栏——线程安全 文化袁探索专栏—— ...............

文化园 2135

深入解析Activity、Window、View三者之间的关系

本文摘要:Android UI框架的核心层级关系是Activity管理Window(通常为PhoneWindow),Window承载DecorView作为根视图,开发者通过setContentView()设置的View树则被添加到DecorView内部的mContentParent容器中。Activity负责生命周期管理,Window作为中间层处理UI请求,DecorView则整合系统UI和应用内容。源码分析显示,这一关系始于Activity创建时实例化PhoneWindow,并通过attach()方法建立

csdn_silent的博客 1339

解析Activity、Window、View三者关系

前言 从问题出发,往往能更明确的找到所求。本文将带着一个个的问题,结合源码,逐步解析Activity、Window、View的三者关系。 什么地方需要window? 一句话总结:有视图的地方就需要window Activity、Dialog、Toast... PopupWindow和Dialog有什么区别? 两者最根本的区别在于有没有新建一个window,PopupWindow没有新建,...

厚德出品,必是精品 2060
上一篇: 通过style实现Activity的界面切换
下一篇: Webview获取连续H5页面的标题
arplay
博客等级 码龄12年 0粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值