Android setContentView()源码分析
文章目录
- Android setContentView()源码分析
- 前提
- setContentView() 源码分析
- 总结
Android setContentView()源码分析
前提
Activity 的生命周期与 ActivityThread 相关,调用 startActivity() 时,会调用 ActivityThread#performLaunchActivity(),接着调用 Activity#attach() 并在其中创建 PhoneWindow。
Activity 持有 PhoneWindow 对象,PhoneWindow 持有 DecorView。
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {activity.attach(appContext, this, getInstrumentation(), r.token,r.ident, app, r.intent, r.activityInfo, title, r.parent,r.embeddedID, r.lastNonConfigurationInstances, config,r.referrer, r.voiceInteractor, window, r.activityConfigCallback,r.assistToken, r.shareableActivityToken);return activity;
}
public class Activity {private Window mWindow;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, ActivityConfigCallback activityConfigCallback, IBinder assistToken,IBinder shareableActivityToken) {// 创建PhoneWindowmWindow = new PhoneWindow(this, window, activityConfigCallback);}
}
public class PhoneWindow extends Window {private DecorView mDecor;ViewGroup mContentParent;
}
setContentView() 源码分析
// Activity#setContentView()
public void setContentView()(@LayoutRes int layoutResID) {// 调用PhoneWindow#setContentView()getWindow().setContentView(layoutResID);initWindowDecorActionBar();
}public Window getWindow() {return mWindow;
}
// PhoneWindow#setContentView()
// 核心代码:
public void setContentView()(int layoutResID) {if (mContentParent == null) {// 初始化DecorViewinstallDecor();} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {mContentParent.removeAllViews();}// 将布局添加到ContentView中mLayoutInflater.inflate(layoutResID, mContentParent);
}
// PhoneWindow#installDecor()
private void installDecor() {mForceDecorInstall = false;if (mDecor == null) {// 创建DecorViewmDecor = generateDecor(-1);} else {mDecor.setWindow(this);}if (mContentParent == null) {// 获取ContentViewmContentParent = generateLayout(mDecor);}
}
// PhoneWindow#generateDecor()
protected DecorView generateDecor(int featureId) {Context context;if (mUseDecorContext) {Context applicationContext = getContext().getApplicationContext();if (applicationContext == null) {context = getContext();} else {context = new DecorContext(applicationContext, this);if (mTheme != -1) {context.setTheme(mTheme);}}} else {context = getContext();}// 创建DecorView,DecorView继承自FrameLayoutreturn new DecorView(context, featureId, this, getAttributes());
}
// PhoneWindow#generateLayout()
// 核心代码:
protected ViewGroup generateLayout(DecorView decor) {// 布局idint layoutResource;int features = getLocalFeatures();// 省略layoutResource赋值流程,根据主题赋值// ...// 加载layoutResource生成View,并加载到DecorView中mDecor.onResourcesLoaded(mLayoutInflater, layoutResource);// 通过DecorView获取id为ID_ANDROID_CONTENT的ViewViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT); return contentParent;
}
总结
执行流程:
- Activity#setContentView()
- PhoneWindow#setContentView()
- PhoneWondow#installDecor()
- PhoneWindow#generateDecor() 创建DecorView
- PhoneWindow#generateLayout() 加载layoutResource并获取ContentView
- 将自定义布局添加到ContentView中
相关文章:
Android setContentView()源码分析
文章目录 Android setContentView()源码分析前提setContentView() 源码分析总结 Android setContentView()源码分析 前提 Activity 的生命周期与 ActivityThread 相关,调用 startActivity() 时,会调用 ActivityThread#performLaunchActivity()…...
BERT 微调
BERT微调 微调 BERT BERT 对每一个词元( token )返回抽取了上下文信息的特征向量 不同的任务使用不同的特征 句子分类 将 < cls > 对应的向量输入到全连接层分类 命名实体识别 识别一个词元是不是命名实体,例如人名、机构、位置…...
K8S使用--dry-run输出资源模版和兼容性测试
1、生成资源模版 使用 --dry-run 创建资源: kubectl create deploy web-ng --imagenginx:1.28 --replicas2 --dry-runclient -o yaml # 查询是否存在 web-ng的资源 kubectl get deployment -A |grep web-ng 通过以上命令可以看到,web-ng的deployment并没…...
01硬件原理图
一、硬件设计关键信息 原理图概要: 1. 核心板:上电时序控制,DDR3,Flash。 2. 底板:以太网,USB,IO,AD9361,射频链路等。 设计Xlinx的原理图和PCB设计需要的文档: 1、…...
算法 | 长颖燕麦优化算法AOO,算法原理,公式,深度解析+性能实测(Python代码)
以下是对长颖燕麦优化算法(AOO)的深度解析,结合其灵感来源、算法原理、公式推导及性能实测分析: 一、算法原理与行为建模 长颖燕麦优化算法(AOO)基于燕麦种子的三种自然行为设计优化策略,模拟其适应环境的动态过程: 种子传播(全局探索阶段) 行为模拟:种子通过风、水…...
5.1经典架构
一、大模型架构 了解常见的大模型架构,如 GPT 系列、LLaMA 系列、GLM 系列、Qwen 系列、DeepSpeek 系列等。对比他们之间的差异,以及每个模型演变过程 模型主要机构技术路线特点中文适配情况GPT 系列OpenAIDecoder-only对话能力强、商业化领先英文为主&a…...
BBS (cute): 1.0.2靶场渗透
BBS (cute): 1.0.2 来自 <BBS (cute): 1.0.2 ~ VulnHub> 前言:攻击机无法扫描靶机解决方案 1,在开机时,按下shift进入界面,按e进入该界面 2,ro替换为 rw signie init/bin/bash 3,按Ctrl键X键如果没成…...
Redis面试 实战贴 后面持续更新链接
面试问题列表: Redis支持哪些数据类型?各适用于什么场景? Redis为什么采用单线程模型?优势与瓶颈是什么? RDB和AOF持久化的区别?如何选择?混合持久化如何实现? Redis缓存穿透、雪…...
搭建spark yarn 模式的集群
搭建Spark YARN模式集群步骤 1. 环境准备 系统:采用Linux系统(如Ubuntu、CentOS ),借助ntp实现节点间时间同步,关闭防火墙及SELinux。 Java:安装JDK 8及以上版本,配置JAVA_HOME环境变量。 H…...
静态库和动态库的区别
简而言之:静态库是.o文件,是直接编译到进程里面的,其他的进程不能使用,动态库是.so文件,是放到linux的文件系统里面的,在程序运行的时候去拿来调用,所以多个进程都能访问 # Linux中的静态库与动…...
Relay算子注册
TVM 卷积算子注册代码深度解析 源码位置:src/relay/op/nn/convolution.cc 作用:conv2d等算子的注册实现 TVM_REGISTER_NODE_TYPE(Conv2DAttrs);TVM_REGISTER_GLOBAL("relay.op.nn._make.conv2d").set_body_typed([](Expr data, Expr weight,…...
俄罗斯电商市场:增长与变革中的新势力崛起
近年来,全球跨境电商市场格局正经历深刻变革,东南亚、非洲、拉美和中东等新兴市场凭借人口红利和互联网渗透率提升,成为国际电商企业竞相争夺的蓝海。然而,在这场全球化的电商浪潮中,俄罗斯市场正以惊人的增速和独特的…...
HHsuite3 的 HHblits 和 HHsearch比较
HHblits 与 HHsearch 的核心区别及远源同源检测能力对比 一、核心功能与定位差异 特征HHblitsHHsearch核心目标快速迭代搜索,构建高质量多序列比对(MSA)和 Profile HMM,用于大规模序列聚类与初步同源筛选。高精度 Profile HMM-HMM 比对,用于深度同源检测与结构 / 功能预测…...
C++(1)
一、从 C 到 C 1、引用(掌握) 1.1 概念 别名机制:引用本质上是对变量的一种别名,它就像变量的另一个名字,对引用的操作实际上就是对原变量的操作。从底层实现来看,引用可能是通过指针来实现的࿰…...
Android组件化 -> Debug模式下,本地构建module模块的AAR和APK
本地构建module模块的AAR gradle.properties isCommonApp false模块的build.gradle apply plugin: com.android.library:module模块编译manifest.srcFile src/main/AndroidManifest.xml:读取没有启动App和Activity的配置文件 if (isCommonApp.toBoo…...
“wsl --install -d Ubuntu-22.04”下载慢,中国地区离线安装 Ubuntu 22.04 WSL方法(亲测2025年5月6日)
从中国地区通过 wsl --install 或 Microsoft Store 安装 WSL 发行版(如 Ubuntu)时,下载速度往往非常慢,甚至卡在 0% 很久。这是因为微软服务器在国内访问速度受限。 以下是几种 解决方法,可加快 WSL 发行版࿰…...
CAN报文中的标准帧和扩展帧
目录 1. 标准帧(Standard Frame) 2. 扩展帧(Extended Frame) 3. 核心区别 4. 如何区分标准帧与扩展帧? 5. 应用场景 6. 注意事项 在CAN(Controller Area Network)总线协议中,标…...
使用AI应用开发平台搭建夸奖机器人,玩转AI【COZE入门案例-第1课】
Coze Coze是字节跳动旗下的产品,更注重用户友好性和C端场景优化。其主要特点包括: 快速部署:Coze提供拖拽式界面和丰富的插件(如天气查询、电商导流工具),适合快速搭建对话机器人和轻量化应用。生态集成:Coze依托字节生态,支持与飞书、抖音等平台的无缝集成…...
二叉树—中序遍历—非递归
初始状态 假设当前从根节点 b 开始,此时栈为空 。 第一步:处理根节点 b 的左子树 调用 goAlongLeftBranch 函数,从节点 b 开始,因为 b 有左子树(节点 a ),将 b 入栈,此时栈&#…...
空间内任意点到直线和平面的距离推导
前言 点到直线,点到面的距离公式的手工推导。很久没有数学推导了,再试一把。 一、初步推导 二、转换为标准的形式 三、两种特殊情况的验证 四、推广到3维的情况 结束语 可能从向量的角度来推导,更加的便捷。很多数学知识都忘记了,…...
代码随想录算法训练营第九天 |【字符串】151.翻转字符串里的单词、卡码网55.右旋转字符串、28.实现strStr、459.重复的子字符串
代码随想录算法训练营第九天 |【字符串】151.翻转字符串里的单词、卡码网55.右旋转字符串、28.实现strStr、459.重复的子字符串 151.翻转字符串里的单词 思路 我的想法是模拟,用状态机拾取单词,然后存到双重数组中,再反向读取输出状态机有…...
Unity学习笔记二
文章目录 3D数学公共计算结构体Mathf常用成员三角函数 向量Vector3基本成员点乘叉乘插值运算 四元数引出基本概念Quaternion结构体成员四元数运算 更多的Mono延迟函数协同程序多线程相关协程概念辨析协程本体协程调度器 Resources资源动态加载特殊文件夹Resources同步加载Resou…...
tp8+swoole搭建
1、根据官方文档下载tp8.1.2. php>8,tp8的运行界面已经不是初心不改了。而是值得托付。 composer create-project topthink/think tp8swoole cd tp8swoole composer require topthink/think-swoole 2、下载thinkswoole captcha,image,migration,queue,不要要template和v…...
Android Retrofit框架分析(三):自动切换回主线程;bulid的过程;create方法+ServiceMethod源码了解
目录 Okhttp有什么不好?bulid的过程create方法ServiceMethodcall enqueue的过程为什么要学习源码呢? 一、Okhttp有什么不好? Okhttp本身来说,是一个挺好的网络框架,但,对于开发者而言,使用起…...
FPGA----基于ZYNQ 7020实现petalinux文件持久化存储
引言:由于当前的 PetaLinux 系统使用了临时的内存文件系统(initramfs),导致每次重启后所有更改(包括安装的 EPICS)都会丢失。为了解决这个问题,您需要将根文件系统(rootfs࿰…...
【STM32项目实战】一文了解单片机的SPI驱动外设功能
前言:在前面我有文章介绍了关于单片机的SPI外设CUBEMX配置,但是要想使用好SPI这个外设我们还必须对其原理性的时序有一个详细的了解,所以这篇文章就补充一下SPI比较偏向底层的时序性的逻辑。 1,SPI简介 SPI是MCU最常见的对外通信…...
C++学习之路,从0到精通的征途:priority_queue类的模拟实现
目录 一.priority_queue的介绍 二.仿函数 1.仿函数的介绍 2.仿函数的特点 3.实现两个简单的仿函数 三.priority_queue的接口实现 1.成员变量 2.push 3.pop 4.top 5.size 6.empty 7.构造函数 四.代码总览 priority_queue.h test.cpp 一.priority_queue的介绍 源…...
智能交互电子沙盘,重塑未来指挥体系
在军事演习室、应急指挥中心或城市规划馆中,传统沙盘曾是不可或缺的工具。然而,随着数字化浪潮席卷,“纸上谈兵”式的静态模型已无法满足现代指挥对实时性、交互性、立体化的需求。智能交互电子沙盘系统应运而生,它融合了GIS地理信…...
银河麒麟安装QT
1、从官网现在安装包 上述是商业版,免费版如下,有两种可以选择,分别是Linux x64 和 LinuxARM64 . 然后在线安装即可,和Windows系统安装步骤一样。...
Vue 实现 Hls、Flv 协议视频播放
在当今的互联网内容生态中,视频已成为重要的信息传播载体。Hls(HTTP Live Streaming)和 Flv(Flash Video)作为广泛使用的视频传输协议,分别在移动端和 Web 端有着出色的表现。对于使用 Vue 框架进行开发的项…...
javascript:void(0) 是一个常见的 JavaScript 伪协议
javascript:void(0) 是一个常见的 JavaScript 伪协议,下面从几个方面详细解释其含义和用途。 基本含义 javascript: 是一种伪协议,它告诉浏览器后面跟随的是一段 JavaScript 代码。void 是 JavaScript 中的一个操作符,void(0) 的作用是对给…...
suna界面实现原理分析(三):Terminal工具调用可视化
suna目前的agent执行可视化界面主要有个实时界面,一个是前面介绍的浏览器访问界面,分析参考:suna工具调用可视化界面实现原理分析(二)-CSDN博客 下面的Terminal界面,对应的分析参考: 前端知识-…...
ai大模型学习1
一、监督学习:老师带学生的模式 核心机制:模型像学生一样,通过“带答案的习题”(即带标签的数据集)学习规律。例如,给模型看1000张标有“猫”“狗”的图片,让它学会区分两者的特征24。 典…...
精益数据分析(43/126):媒体网站商业模式的盈利与指标解析
精益数据分析(43/126):媒体网站商业模式的盈利与指标解析 在创业和数据分析的学习旅程中,我们不断探索各种商业模式的奥秘,今天让我们一同深入《精益数据分析》,聚焦媒体网站商业模式,剖析其盈…...
深度学习:图神经网络GNN、GCN及其在推荐系统的应用
什么是图(Graph)? 在数学和计算机科学中,图 (Graph) 是一种抽象数据结构,用于表示对象之间的成对关系。一个图通常定义为一个有序对 G (V, E),其中: V 是 顶点 (Vertices) 或 节点 (Nodes) 的…...
深入理解 Web 架构:从基础到实践
文章目录 引言一、Web 架构基础概念客户端 - 服务器模型HTTP 协议 二、常见 Web 架构模式单体架构微服务架构 三、Web 架构常见问题及解决方法性能问题安全问题 四、Web 架构思维导图五、总结 引言 在当今数字化的时代,Web 应用无处不在。无论是社交媒体平台、电子商…...
蓝桥杯-通电(最小生成树java)
题目 思路 这道题其实也挺容易看出来是最小生成树的。我当时做的时候确实是能看出来是考的最小生成树,union(),find()那些方法我也能写出来,但是,我完全不知道怎么去利用给你的输入数据,去求解题目,也就是知…...
代码随想录算法训练营第60期第二十八天打卡
今天我们继续回溯算法章节,昨天我们重点讲的是组合问题,我们完美使用递归三部曲以及递归回溯相结合的方法来解决,当然昨天最有难度的还是去重操作,那个大家要多思考一下,那么今天我们就继续探讨回溯算法。 第一题对应…...
vscode远程服务器连接----过程尝试写入的管道不存在
通过跳板机连接远程服务器时,报错---过程尝试写入的管道不存在 过程尝试写入的管道不存在报错解决报错内容解决方法1. 测试网络连接连接是否正常2. 检查跳板机并打开权限3. 通过跳板机登录到目标服务器4.配置文件范例 注:校外连接学校内网服务器报错 过程…...
C++ - 仿 RabbitMQ 实现消息队列(1)(环境搭建)
C - 仿 RabbitMQ 实现消息队列(1)(环境搭建) 什么是消息队列核心特点核心组件工作原理常见消息队列实现应用场景优缺点 项目配置开发环境技术选型 更换软件源安装一些工具安装epel 软件源安装 lrzsz 传输工具安装git安装 cmake安装…...
多模态核心模型
1.BLIP的原理? BLIP是一种统一视觉语言理解和生成的预训练模型。BLIP的特点在于它采用了一种编码器-解码器混合架构(MED),并且引入了CapFilt机制来提高数据质量和模型性能。BLIP的主要组成部分包括: MED架构:包括单模态编码器、…...
Kubernetes笔记(1)Kubernetes入门
Kubernetes入门 一、容器技术二、Kubernetes介绍1. Kubernetes核心资源2. Kubernetes集群架构2.1 Master2.2 Node 一、容器技术 随着技术发展,应用程序的部署经历了从物理机到虚拟机,再到容器的转变。 物理机:物理机会运行多个程序…...
【coze】意图识别(售前售后问题、搜索引擎去广告)
【coze】(售前售后问题、搜索引擎去广告) 1、创建意图识别工作流(1)创建工作流(2)添加意图识别节点(3)配置意图识别节点(4)运行看效果(5ÿ…...
Vue3 中用 canvas 封装抽奖转盘组件:设定中奖概率及奖项图标和名称
在 Web 应用开发中,抽奖功能是提升用户参与度的常用手段。使用 Vue3 结合 canvas 技术,我们可以轻松实现一个高度自定义的抽奖转盘组件,不仅能设定中奖概率,还能灵活配置奖项图标和名称。本文将详细介绍该组件的实现原理、步骤&am…...
vue3+vite+AI大模型实现谷歌插件-web诊断
vue3viteAI大模型实现谷歌插件-web诊断 一、前言二、实现思路1、功模块构图2、数据交互图 三、技术栈简介1、Web端2、服务端 四、主要功能实现1、Web端【1】谷歌插件vue全局配置文件【2】加载web诊断工具至当前页面【3】全局捕获异常错误 2、Server端【1】websock管理模块【2】…...
高频PCB设计如何选择PCB层数?
以四层板为例,可以第一层和第二层画信号,作为信号层。 第三层可以走电源,然后第四层走GND 但是更可以第一层和第三层画信号。第二层可以走电源,然后第四层走GND 用中间的电源层以及地层可以起到屏蔽的作用,有效降低寄…...
第100+40步 ChatGPT学习:R语言实现多轮建模
回顾一下什么叫多轮建模: 要综合判断一个模型好不好,一次随机抽样是不行的,得多次抽样建模,看看整体的性能如何才行(特别是对于这种小训练集)。 所以我的思路是,随机抽取训练集和验证集2000次…...
DolphinScheduler-3.2.0集群部署教程
详见: DolphinScheduler-3.2.0集群部署教程Centos7 DolphinScheduler集群部署...
如何设计Kafka的高可用跨机房容灾方案?(需要实战,未实战,纯理论)
1. 双活多中心架构设计 startuml 机房A <--> [Kafka Cluster A] : 万兆光纤 机房B <--> [Kafka Cluster B] : 专线网络 机房C <--> [Kafka Cluster C] : VPN隧道[Kafka Cluster A] <-.-> [Kafka Cluster B] : MirrorMaker2双向镜像 [Kafka Cluster B]…...
[人机交互]协作与通信的设计
零.要点 – 解释协作与通信的含义 – 描述人们在协作与通信中使用的社会机制的主要类型 – 概述存在的各种群件系统 – 讨论学科研究和与社交相关的理论,对设计的启示 一.解释协作与通信的含义 1.1什么是通信 通信是个体之间的信息交换的过程 – 按照所 交换信息的…...