恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Android: setContentView

  • 首页
  • 资讯中心
  • /
  • Android: setContentView

相关资讯

ACO-BPNN混合算法优化电厂数据预测的MATLAB实现 2026/8/6 22:07:11
单片机毕设项目:基于 STM32 的三模式温控风机硬件监测平台开发 基于单片机的 DS18B20 传感智能排风调控装置实现(011202) 2026/8/6 22:07:11
DeepSeek Agentic Workflow 翻车实录:Reflection 模式让我的任务延迟暴涨 200% 2026/8/6 22:02:11

最新资讯

让猪猪AI帮你写单元测试:多模型协作生成测试用例的5个步骤
AI工具聚合平台实操:如何利用猪猪AI多模型对比快速生成网文人设与大纲?
开题答辩PPT怎么做?用猪猪AI 5分钟搞定大纲的完整教程
AI 电动加热雪地靴智能功率 MOSFET 完整选型方案
用 Cherry Studio 接入 Ace Data Cloud:一个 Token 打通 Claude、GPT、Gemini、DeepSeek 等主流模型
等价类覆盖属于黑盒测试方法,不依赖程序内部结构,而是基于输入域的划分

今日推荐

CAD图库管理:从文件归档到设计资产管理的效率革命
5分钟掌握Wand-Enhancer:2026年终极WeMod专业版免费解锁指南
“Quality Control(质量控制)”在软件工程中通常指通过一系列活动确保软件产品符合预定的质量标准和用户需求

本周热门

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案
分布式配置中心选型实战:Nacos与Consul在创业场景下的对比
MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

本月精选

如何用DamaiHelper实现演唱会门票的智能自动化抢购:完整技术解决方案指南
第4篇:59 倍性能差距的索引瓶颈定位——一次教科书级的全表扫描调优
终极歌词批量下载神器:5分钟解决离线音乐库歌词同步难题

Android: setContentView

发布时间:2026/8/6 22:07:11
Android: setContentView View 从创建到显示的主干流程一句话核心结论setContentView只是加载了布局结构真正的测量、布局、绘制Measure/Layout/Draw是在onResume之后由ViewRootImpl触发的。1. 第一阶段布局加载发生在 onCreate入口Activity.setContentView(layoutResID)。关键对象mWindow实际类型是PhoneWindow 实际执行phoneWindow.setContentView()。动作拆解创建顶级容器DecorView本质是FrameLayout即整个Window的根View。根据主题加载系统布局如screen_simple.xml先将整个系统布局作为子View添加到 DecorView 中然后通过findViewById(android.R.id.content)从该布局中查找出 FrameLayout ViewGroup并将其赋值给mContentParent。将我们写的main.xml通过LayoutInflater填充进mContentParent中。DecorView (FrameLayout顶级根布局) │ └── 系统布局根视图 (比如 LinearLayout 或 FrameLayout取决于主题) │ ├── TitleBar / ActionBar (可选有主题时才有) │ └── FrameLayout --- 这就是 mContentParent (id android.R.id.content) │ └── 你的 main.xml 布局 (通过 setContentView 塞进来的)mDecorDecorView 以及 mContentParent 是 Window 的成员变量此时View树已在内存中构建完毕但尚未进行尺寸测量和绘制所以屏幕不可见。2. 第二阶段添加窗口并触发绘制发生在 onResume 之后入口ActivityThread.handleResumeActivity。关键动作获取之前创建的DecorView以及 WndowManager。通过WindowManagerImpl调用addView(decorView, params)。实际委托给WindowManagerGlobal单例类在此处实例化核心桥梁——ViewRootImpl。调用ViewRootImpl.setView(decorView)向WMSWindowManagerService发起跨进程请求将Window显示到屏幕上。WMS回调后ViewRootImpl立即调用performTraversals()正式开启View的三大流程Measure - Layout - Draw。核心时序图Mermaid下图清晰展示了从onCreate到屏幕显示的完整调用链红色标注为三大流程的触发点WMS(系统服务)ViewRootImplWindowManagerGlobalDecorViewPhoneWindowActivityWMS(系统服务)ViewRootImplWindowManagerGlobalDecorViewPhoneWindowActivity获得mContentParent阶段1结束View树构建完毕但尺寸为0不可见执行 performMeasure- performLayout- performDraw阶段2结束界面正式显示1. setContentView(R.layout.main)创建顶级DecorView(FrameLayout)根据主题加载系统布局findViewById(android.R.id.content)LayoutInflater.inflate(main, mContentParent)onResume执行完毕handleResumeActivity2. wm.addView(decorView, params)实例化ViewRootImplroot.setView(decorView)跨进程请求(IPC)添加窗口回调确认3. performTraversals()分发测量/布局/绘制面试追问环节高频考点补充ViewRootImpl 是 View 吗不是。它是Handler的实现类是连接WindowManager和DecorView的桥梁负责控制View树的遍历performTraversals。onCreate里能获取 View 的宽高吗不能。因为此时ViewRootImpl还没创建performTraversals尚未执行要等到onResume之后的handleResumeActivity中才触发。若需获取请使用View.post()或onWindowFocusChanged。DecorView的结构是怎样的最外层是DecorViewFrameLayout内部通常包含一个垂直的LinearLayout里面包含TitleBar可选和ContentParent即android.R.id.content。我们的布局就在ContentParent里。为什么子线程不能更新UI当 View 树接入窗口系统后ViewRootImpl会记录创建它的线程正常情况下就是主线程。当某些 UI 更新操作传递到 ViewRootImpl 时它会检查当前线程如果不是创建ViewRootImpl的线程就会抛出CalledFromWrongThreadException。但是viewRootImpl没有创建时(onResume()后由WindowManager.addView()创建的 在首次启动Activity在onCreate()可以在子线程 尝试进行UI更新在viewRootImpl创建之前某些 View 属性修改可能只是改变了内存中的字段没有经过ViewRootImpl的线程检查因此偶尔不会报错。但这并不代表子线程可以合法更新 UI这种行为存在竞态条件且不可靠。实际开发中仍然必须切换到主线程更新 UI。记忆口诀助记OnCreate 只是搭架子InflateOnResume 后才画图子Traversals。PhoneWindow 管全局DecorView 是根父ContentParent 占坑位ViewRootImpl 触遍历。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号