转自:
http://tech.ddvip.com/2010-05/1273125396152852_4.html
关于资源配置,以及选择的详情,参见SDK中的:guide/topics/resources/resources-i18n.html部分。
R类
在使用资源后,界面逻辑与底层逻辑的耦合被降低了,但这不意味着,两者没有关联了。比如,需要为某个按钮增加一个点击事件,就需要定位到所需的那个按钮;再比如,你需要使用某个字符串资源,通知用户某件事情,就需要能定位到资源中放置的该字串。
最显而易见的一种方式,就是通过字符串比较,用名字信息在资源的xml描述文件中定位到所需的内容,加载并使用。这种方式,解决了查找的问题,但反复的字符串比较,势必带来严重的效率隐患。因此,在Android中,类似于Symbian的方法,引入了一个R类。
它的基本思想是,通过增加一个额外的编译器,为所有的资源项,都赋予一个32位的整形数来表示,同一个资源像的不同配置,都使用同一个id。这个整形数,就相当于这个资源项的门牌号码,能够帮助定位到对应的资源项。所有的这些整形数,都以常量的方式,整合到一个Java类中,这个类就是R类。这样,在程序中,就可以通过使用这个R类,来查找所需的资源,这就将字符串比较,简化成了一个整形数的比较,大大的节约了开销。
不得不说,这整套逻辑和Symbian中的资源文件预编译一致。但两者很不同的点在于Symbian中的整形数,代表的是一个二进制流的偏移量,资源中的内容在编译时决定了。而Android中的整形数,是一个有逻辑意义的数值,它表达了这个资源所处的资源包,类别,和脚标,它的具体内容在运行时才确定,这使得它的灵活性大大增强,付出的则是一定的效率代价。实现
按照惯例,还是要说实现的,以一个查找流程为示例。当在Activity中需要使用字符串的,会调用它的getString方法,传入R.stirng.xxx的一个整形数,换取一个符合当前机器环境配置的字符串。
getString,追根溯源,来到AssetManager类中。Asset类,其实是一个空壳,它仅仅是提供了一些便利的接口,而将请求,通过JNI的接口,传入到了底层C++实现的类库中。
在底层的实现,主要是在C++实现的,AssetManager,ResourceTypes等等之中。其中:
JNI文件在:framework/base/core/jni
头文件在:framework/base/include/utils
CPP文件在:framework/base/libs/utils
具体实现,和前述的算法逻辑是一致的。每一个资源的id,32位,高8位表示资源包,低16位用于描述脚标,中间8位,用来说明类别。所有资源中的文件,都被预处理了,放入到了一系列的队列和表中,通过id,可以查到具体的位置。然后根据缓存的环境设置对象,跑一次淘汰算法,获得匹配的资源对象的对应文件和偏移量。然后将值读取出来,通过JNI接口,拷贝回去。
以上这些描述,并不能帮助了解真实的实现细节,主要是为了促使大家对读取资源的效率有一个比较直观的认知。整个资源读取的流程比较长,但是实现在C++中,可以预想,效率比Java高一些,开发人员,应该能够根据自己的需求,决定是否将内容写入资源文件中(还是写在代码中...),是不是需要自己稍微缓存一下,诸如此类。
分享到:
相关推荐
《基于Android Resource sharing APP系统设计与实现》这篇文章探讨了如何构建一个基于Android平台的信息资源共享应用。随着移动互联网技术的进步和4G网络的普及,越来越多的人依赖手机等移动设备获取信息。针对大...
在Android开发中,资源表(Resource Table)是一个至关重要的组成部分,它管理着应用程序中的各种非代码资源,如图片、字符串、颜色、布局等。资源表允许开发者以结构化的方式存储和引用这些资源,使得应用更加国际...
简单Android学习代码,无聊打发时间看一下也行
在Android开发中,资源(Resource)是应用中非代码元素的重要组成部分,如用户界面布局、图像、字符串等。"android resource doc" 提供了关于Android资源的详细文档,特别是针对API级别8,也称为Android 2.2 (Froyo)...
### Android Gradle 用户指南知识点详解 #### 一、Gradle构建系统概述 **目标与优势:** - **目标:** - **简化代码与资源复用:**Gradle旨在简化跨项目共享代码和资源的过程,使得开发人员能够更加高效地进行...
《Android Resource Translator: 开源助力跨语言开发》 在当今全球化的时代,移动应用的多语言支持成为了一项必备功能。Android Resource Translator 是一个专为Android开发者设计的工具,旨在帮助他们快速、高效地...
Android资源管理器 作为Android开发人员的跨平台工具,AndroidResourceManager-ARM为您提供五项主要服务 图像调整服务 您可以轻松地调整可绘制,mipmap或普通图像的大小,不受大小限制,默认大小为7,即ldpi,mdpi...
详细和全面演示了Android各种资源的定义和使用方法及其效果,可以在Android5.0以上系统运行,
AndroidResource 自己总结的Android开源项目及库。 github排名 ,github搜索: 目录 ======== 具体内容 ============================= ======== UI - MaterialDesignCenter改名为Awesome-MaterialDesign,优化了布局...
AndroidResource 大纲 第一部分 技术框架 -- 图片加载 网络请求 数据库ORM Json解析 常用工具 依赖注入 快速开发 动态加载 热修复 事件总线 性能工具 图表 响应式编程 日志框架 第二部分 博客社区 个人博客 团队...
Android Resource Navigator A Google Chrome Extension providing enhanced resource navigation for GitHub hosted Android projects. Features Linkified XML resources Android XML resources viewed on GitHub...
在Android开发中,资源(Resource)是应用程序中非代码的数据,如字符串、图片、布局文件等。资源文件存储在项目的res目录下,通过Android Studio编译后会被编译为二进制格式,便于运行时访问。本示例着重介绍Android...
2. **Resource Codes解析** Android资源代码是应用中非代码的部分,包括布局文件、图像、字符串、颜色、动画等。这些资源通过ID进行引用,使得代码更易于维护和本地化。在Android 7的SDK中,开发者可以研究各种资源...
在C#开发中,这可能涉及到与Android Resource(R类)的交互。 6. **事件驱动编程**: 在Android中,很多操作是通过事件触发的。例如,按钮点击、屏幕旋转等。开发者需熟悉如何在C#中处理这些事件,以及如何使用...
Android App Linking > The ultimate developer guide to Android application linking methods Read documentation at https://simonmarquis.github.io/Android-App-Linking License Copyright 2017 Simon ...
Right click to res then New > Android Resource File, type a file name and make sure you choose ResourceType as Menu. Here is a sample menu file. You can add android:checked="true" if you want that ...
ARSC是Android Resource String Container的缩写,它是Android系统用来存储应用程序资源的一个二进制格式。arsceditor是一款用于解析和编辑ARSC文件的工具,它可以帮助用户直接操作APK中的资源字符串表,包括应用...
1. **创建Navigation Graph**:在Android Studio中,通过New > Android Resource File > Navigation Graph来创建。 2. **定义目的地**:在图形界面或XML中添加Fragment或Activity作为目的地。 3. **添加动作**:连接...
Android提供了Android Resource(Res)目录结构,其中包含了图标、字符串、颜色等资源。在开发过程中,开发者可以修改res/drawable或res/values中的相关XML文件来改变信号图标和其他UI元素。同时,Android的...
3. 适配不同的Android版本:使用条件资源(Android resource qualifiers)来确保在不同Android版本上运行良好。 七、Android Studio的资源管理工具 Android Studio提供了一系列工具来帮助管理资源,如Asset Studio...