android 中View, Window, Activity, WindowManager,ViewRoot几者之间的关系

理性分析Window、Activity、DecorView以及ViewRoot之间关系 将DecorView建立起来,通过setContentView设置的界面,如何在onResume后对用户可见,需要从ActivityThread说起;重点看下handleResumeActivity(),在这其中,DecorView将会显示出来,同时重要的一个角色;ViewRoot也将登场;当我们执行了Activity.makeVisible()方法之后,界面才对我们是可见的;Activity和window,DecorView ,viewRoot是什么关系。今天我们就来讲解下,这样你在面试时候,游刃有余; 阅读详情

(1)View:最基本的UI组件,表示屏幕上的一个矩形区域。

(2)Window: 表示一个窗口,不一定有屏幕那么大,可以很大也可以很小;
                         它包含一个View tree和窗口的layout 参数。
                         View tree的root View可以通过getDecorView得到。还可以设置Window的Content View。

(3)Activity:Activity包含一个Window,该Window在Activity的attach方法中通过调用
                      PolicyManager.makeNewWindo创建

(4)WindowManager:一个interface,继承自ViewManager。 有一个implementation 

(5)class:android.view.WindowManagerImpl
       
       其实WindowManager并不是整个系统的窗口管理器,而是所在应用进程的窗口管理器。系统全局的窗口管理器运行在SystemServer进程中,是一个Service。
      
       ViewRoot通过IWindowSession接口与全局窗口管理器进行交互。 将一个View add到WindowManager时,WindowManagerImpl创建一个ViewRoot来管理该窗口的根View。并通过ViewRoot.setView方法把该View传给ViewRoot。
       
       ViewRoot用于管理窗口的根View,并和global window manger进行交互。ViewRoot中有一个nested class: W,W是一个Binder子类,用于接收global window manager的各种消息, 如按键消息, 触摸消息等。 ViewRoot有一个W类型的成员mWindow,ViewRoot在Constructor中创建一个W的instance并赋值给mWindow。 ViewRoot是Handler的子类, W会通过Looper把消息传递给ViewRoot。 ViewRoot在setView方法中把mWindow传给sWindowSession。



        ActivityThread.java中调用wm.addView(decor, l);把它加入到window manager 
proxy的mViews中,同时为这个decor view创建一个ViewRoot,ViewRoot负责协调decor view与window 
manager直接绘图、事件处理。

ViewRoot中有IWindowSession和IWindow用来和window manger打交道和接收window 
manager传过来的消息,消息传过来后ViewRoot分发给decor view,再由decor view进行分发



  
      总之,每个窗口对应着一个Window对象,一个根View和一个ViewRoot对象。要想创建一个窗口,可以调用
WindowManager的addView方法,作为参数的view将作为在该窗口上显示的根view
 

 

 

 

一般来讲,Activity就是一 个可视的人机交互界面。
每一个Activity都有一个默认的Window,一 般来讲,这个Window都是全屏的,当然也有例外,比如Dialog的Window就是非全屏的。Activity也可以利用默认Window以外的其 它的Window,比如弹出一个Dialog对话框。6 i8 J' I' b+ v. F% r 
Window里可见的内容,就是一层一层的View。Window里的View是通过 setContentView这个接口set进去的,这个ContentView就是Window里处于最根部的View。


对于屏幕显示而 言,整个是Activity 其实确切的说是window,为什么这样说呢?

在Activityattach 函数里.有这样一句 mWindow = PolicyManager.makeNewWindow(this);

这句是把Activiyt window关联起来了.真正关联的是PhoneWindow.

这个window里显示的东西是view(activity是逻辑上的东 西,增加了生命周期管理等. 里面具体的东西也是view。而且启动activity的实现也是往window里加view),往window里加view,是通过调用 WindowManager(WindowManagerImpl).addView()来实现的。

为什么可以这样说呢?

看public void setContentView(int layoutResID) {
        getWindow().setContentView(layoutResID);
    }


在 addView里,会为每个view创建一个viewRoot(这是逻辑上的东西,用来负责view的事件处理和逻辑处理,并和 WindowsManagerService建立联系),而在WindowManagerImpl里,会维护viewRoot的数组。

最 终会调用ViewRoot.setView(),在setView里会显示该view等。在setView的实现里,会调用Session.add()来 addWindow,通过这个方法,会将ViewRoot和WindowManagerService联系起来(比如说分发事件等),并且这个方法里会调 用PhoneWindowManager.prepareAddWindowLw()。

这只是模糊概念,还有细节需要推敲,我会继续努 力.如果你感觉是这么会事,你得给我顶了,我也不容易的.都很辛苦啊.
Android面经(17/30)Activity、Window、DecorView以及ViewRoot之间的层级关系 安卓应用开发经常会接触到UI开发,除了对View的绘制流程需要有所了解,对我们目光所及的界面的层级也需要有所了解。Activity、Window、DecorView以及ViewRoot之间到底有什么联系呢? 阅读详情

相关推荐

从开通VPS到搭建宝塔面板全教程

你在输入域名(此时我们可能没有类似aaa.com这样的域名,所以要输入VPS的IP地址)的时候,下面的根目录也会跟着变动,等输入完成后,你可以把根目录再改回成/www/wwwroot/dq。这时,在你的浏览器中,输入外网面板地址的URL,输入username和password,即可登陆宝塔面板。第一次登陆,需要绑定你的宝塔账号,你可以到宝塔的注册界面,用手机注册一个,然后绑定,首先看一下你的VPS操作系统是什么类型的(其实你在选择VPS的时候,就已经选定了,我选择的事Centos系统)。

kxltsuperr的专栏 3734

Android 活动、窗、DecorView、ViewRoot

Android 活动、窗、DecorView、ViewRoot

李青涛的博客 1959

echarts 生成中国陕西省份(或其他省份)的地图,大屏使用

效果图: 一、首先第一步需要下载echarts和获取到陕西身份的地图信息。 1.下载echarts链接(官网): Apache ECharts 2.生成指定省份的地图数据信息,数据可以在阿里云获取。 DataV.GeoAtlas地理小工具系列 如图,点击左圈需要的省份,这里我选择的是陕西省,然后点击右圈复制下载链接,得到一个json格式的数据,可以在json转换网站转成js格式。 Json在线解析格式化-Json在线校验Json格式化压缩-Jsons在线工具 转成js格.

PrimaryColor 3890

Android中Window、WindowManager、ViewRootlmpl关系与作用笔记

一.概述 Window表示一个窗口的概念,通过源码我们可以知道,Window是一个抽象类,那么到底Window的实现类是什么呢?其实是PhoneWindow。创建一个Window是一件很简单的事,只需要通过WindowManager即可完成。WindowManager是外界访问Window的入口,Window的具体实现位于WindowManagerService中,WindowManager和Wi

soso密斯密斯的博客 985

ESP32-S3双模CMSIS-DAP调试器:USB+WiFi无线调试方案

CMSIS-DAP是ARM生态中标准化的嵌入式调试协议接口,广泛用于Keil、IAR、STM32CubeIDE等开发环境。其核心原理是通过SWD/JTAG物理层实现目标芯片寄存器访问、内存读写与断点控制,依赖确定性时序和低延迟通信。传统DAPLink调试器受限于USB线缆束缚,而WiFi-USB-DAPLink项目将完整CMSIS-DAP v2协议栈移植至ESP32-S3平台,同时支持USB CDC直连与WiFi TCP远程通道,兼顾实时性与网络化部署能力。该方案无需主机驱动、兼容主流IDE,并支持多机并发

weixin_31185473的博客 371

Meta-World环境实战解析:pick-place-v2中的状态观测与动作控制

本文深入解析了Meta-World中pick-place-v2环境的强化学习实战要点。文章详细拆解了39维状态观测向量的构成与意义,包括机械臂末端、物体位置及目标坐标,并揭示了默认部分可观测设置的潜在影响。同时,阐述了4维动作空间的控制逻辑与奖励函数的分阶段设计,为训练高效稳定的抓放策略提供了核心指导与实用调优技巧。

weixin_29184371的博客 77

WindowManager.addView添加浮框

WindowManager.addView添加浮框

u014248641的专栏 502

Abaqus 2023 保姆级安装避坑指南:从环境变量到许可证配置,一次搞定

本文提供Abaqus 2023的详细安装指南,涵盖环境变量设置、许可证配置等关键步骤,帮助用户避开常见安装陷阱。通过系统环境检查、目录结构规划、许可证服务器安装及Java环境配置等实用技巧,确保顺利完成安装并优化软件性能。

weixin_42524276的博客 426

android中View, Window, Activity, WindowManager,ViewRoot几者之间的关系

<br />View:最基本的UI组件,表示屏幕上的一个矩形区域。 <br />Window: 表示一个窗口,包含一个View tree和窗口的layout 参数。View tree的root View可以通过getDecorView得到。还可以设置Window的Content View。Activity包含一个Window,该Window在Activity的attach方法中通过调用PolicyManager.makeNewWindow创建。WindowManager:一个interface,继承自Vi

坚持就是胜利 5831

ZYNQ PS裸机开发RS485

RS485 是一种通用的通信标准,广泛用于数据采集和控制应用中。它的主要优点之一是它允许将多个 RS485 设备放在同一条总线上,这使得多个节点可以相互连接。RS-485是美国电子工业协会(EIA)在1983年批准了一个新的平衡传输标准(balanced transmission standard),EIA一开始将RS(Recommended Standard)做为标准的前缀,不过后来为了便于识别标准的来源,已将RS改为EIA/TIA。

baidu_34971492的博客 831

【007】C++编程必知:原码、补码、反码的全面解读

计算机存储的是数据的补码。原码:计算机中对数字的二进制定点表示方法。比如123的原码是0111 1011。无符号数:原码=反码=补码。有符号数:要分正数和负数,正数的最高位为0,负数的最高位为1。其中,正数的原码、反码、补码都是相同的;负数的反码等于原码的符号数(最高位)不变,其他位取反;补码等于反码+1。比如:-123的原码是1111 1011,反码为1000 0100,补码为1000 0101。原码、补码和反码都是用于计算机表示有符号整数的方法。

Lion_Long的博客 2920

windowmanager addview显示view

WindowManager的方法很简单,有三个方法,AddView(),removeView(),updateViewLayout(); AddView();//添加View removeView();//移除VIew updateViewLayout()//更新View View view = LayoutInflater.from(this).inf...

蚁人日记 5448

Go语言面试:面试中经常被问到的50个经典面试题(附参考答案)

Go语言核心知识点摘要 基础语法与数据结构 make和new区别:new分配零值内存返回指针,make初始化引用类型返回实例 Slice底层:包含指针、长度、容量的结构体,多个slice可共享底层数组 nil与空slice:nil指针为nil,空slice指针非nil但JSON编码不同 Map原理:哈希表实现,非线程安全,扩容策略影响性能 for range注意:循环变量是拷贝,map遍历无序 defer执行:LIFO顺序,函数返回前执行 Struct比较:仅当所有字段可比较时才可比较 参数传递:只有值传递

数据知道的博客 4725

扫地机器人核心技术解析:从双线激光雷达到热水洗拖布,石头P20 Max如何实现智能清洁?

扫地机器人作为智能家居的核心设备,其核心技术围绕感知、决策与执行三大系统展开。感知系统依赖激光雷达(LDS)与视觉传感器构建环境地图,其中双线固态激光雷达通过提升扫描速度与精度,实现了更稳定的低矮空间导航与复杂光线下的避障。清洁系统则通过高吸力马达与旋转拖布模组协同工作,而热水洗拖布技术利用60℃高温有效溶解油污,提升了拖地卫生等级与自清洁效果。这些技术创新共同指向提升家庭清洁自动化程度与清洁品质,尤其适用于大户型、有宠物或对地面卫生有较高要求的场景。以石头P20 Max为例,其RR mason 10.0算

aodiyi6351的博客 462

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android中Activity, View,Window,DecorView之间的关系

android中真正展示给用户的是window和view,activity在android中所的作用主要是处理一些逻辑问题,比如生命周期的管理、建立窗口等。在android中,窗口的管理还是比较重要的一块,因为他直接负责把内容展示给用户,并和用户进行交互。响应用户的输入等。 View是真正显示的矩形区域,DecorView是顶层View,也就是主View。 相互之间的关系可以理解为一个Activi

wnk19900925的博客 2599

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android 中Activity,Window和View之间的关系

跟踪Activity的源码就会发现: Activity.attch() -> PolicyManager -> Policy -> PhoneWindow -> mLayoutInflater.inflate()&mContentParent.addView(...

chenglian3656的博客 156

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android viewrootimpl中view的前后关系,android ViewRoot学习,WindowManager和ViewRoot的关系

ViewRoot是GUI管理系统与GUI呈现系统之间的桥梁,根据ViewRoot的定义,我们发现它并不是一个View类型,而是一个Handler。它的主要作用如下:A. 向DecorView分发收到的用户发起的event事件,如按键,触屏,轨迹球等事件;B. 与WindowManagerService交互,完成整个Activity的GUI的绘制。1、View和ViewRootViewRoot从名称...

weixin_39664994的博客 283

Android中Window,DecorView和ViewRoot

文章目录1.Window1.1 Window和WindowManager1.2 Activity的Window创建过程2.DecorView2.1 setContentView源码分析2.2 DecorView的展示3. ViewRoot 1.Window Window是一个抽象类,具体实现是PhoneWindow. Android中所有的视图都是通过Window来呈现的. 每一个Window都对...

David_jia的博客 842
上一篇: 存储区域
下一篇: 详解MediaPlayer与SoundPool的利弊以及各个的用途
待虐青年
博客等级 码龄14年 0粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值