Android Resource.getLayout函数分析-(基于10.0.0)

2024-01-06 21:18

本文主要是介绍Android Resource.getLayout函数分析-(基于10.0.0),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在分析LayoutInflater的时候有一处是需要根据资源ID生成一个XmlResourceParser对象的,这个是通过调用Resource类的getLayout函数实现的,该函数的代码如下

/frameworks/base/core/java/android/content/res/Resources.java

    public XmlResourceParser getLayout(@LayoutRes int id) throws NotFoundException {return loadXmlResourceParser(id, "layout");}

可以看出它内部是调用loadXmlResourceParser并传入“layou”来实现,看来loadXmlResourceParser函数是用来解析多种类别xml的,在Resources类中 getLayout、getAnimation、getXml都是在内部直接调用loadXmlResourceParser的,我们继续往下看

/frameworks/base/core/java/android/content/res/Resources.java

    XmlResourceParser loadXmlResourceParser(@AnyRes int id, @NonNull String type) throws NotFoundException {// 获取一个TypedValue对象,这里使用了一个单Item的对象池,减小对象的申请和释放final TypedValue value = obtainTempTypedValue();try {final ResourcesImpl impl = mResourcesImpl;// 根据资源ID获取对应的文件路径,然后把相关信息存储在value里面impl.getValue(id, value, true);if (value.type == TypedValue.TYPE_STRING) {// 根据文件路径创建XML解释器return impl.loadXmlResourceParser(value.string.toString(), id,value.assetCookie, type);}throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id)+ " type #0x" + Integer.toHexString(value.type) + " is not valid");} finally {// 将TypeValue对象归还给对象池releaseTempTypedValue(value);}}

先调用ResourcesImpl类的getValue函数获取XML文件的路径

/frameworks/base/core/java/android/content/res/ResourcesImpl.java

 void getValue(@AnyRes int id, TypedValue outValue, boolean resolveRefs)throws NotFoundException {boolean found = mAssets.getResourceValue(id, 0, outValue, resolveRefs);if (found) {return;}throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id));}

在getValue中实际上调用了AssetManager.getResourceValue(); AssetManager是Android中的资源管理类,下一篇文章我们分析它

在通过AssetManager获取到资源ID对应的文件路径后调用ResourcesImpl类中的loadXmlResourceParser函数来获取XMLResourceParser

/frameworks/base/core/java/android/content/res/ResourcesImpl.java

XmlResourceParser loadXmlResourceParser(@NonNull String file, @AnyRes int id, int assetCookie,@NonNull String type)throws NotFoundException {if (id != 0) {try {synchronized (mCachedXmlBlocks) {// 在缓存中找已经缓存的XmlBlock,XmlBlock是一个编译过的xml文件final int[] cachedXmlBlockCookies = mCachedXmlBlockCookies;final String[] cachedXmlBlockFiles = mCachedXmlBlockFiles;final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks;// First see if this block is in our cache.final int num = cachedXmlBlockFiles.length;for (int i = 0; i < num; i++) {if (cachedXmlBlockCookies[i] == assetCookie && cachedXmlBlockFiles[i] != null&& cachedXmlBlockFiles[i].equals(file)) {return cachedXmlBlocks[i].newParser(id);}}// 没有已缓存的XmlBlock,就新建一个,并返回// Not in the cache, create a new block and put it at// the next slot in the cache.final XmlBlock block = mAssets.openXmlBlockAsset(assetCookie, file);if (block != null) {final int pos = (mLastCachedXmlBlockIndex + 1) % num;mLastCachedXmlBlockIndex = pos;final XmlBlock oldBlock = cachedXmlBlocks[pos];if (oldBlock != null) {oldBlock.close();}cachedXmlBlockCookies[pos] = assetCookie;cachedXmlBlockFiles[pos] = file;cachedXmlBlocks[pos] = block;return block.newParser(id);}}} catch (Exception e) {final NotFoundException rnf = new NotFoundException("File " + file+ " from xml type " + type + " resource ID #0x" + Integer.toHexString(id));rnf.initCause(e);throw rnf;}}throw new NotFoundException("File " + file + " from xml type " + type + " resource ID #0x"+ Integer.toHexString(id));}

到此我们就知道XmlResourceParser是怎么来的了

 

 

 

 

 

 

这篇关于Android Resource.getLayout函数分析-(基于10.0.0)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/577641

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号