【IT168 技术文档】在OPhone平台中,一个应用程序所要包含和引用的外部元素统称为资源(Resources)。本文介绍了OPhone平台中资源的结构布局、框架实现以及使用,帮助开发者理解OPhone中应用程序资源的概念,以及如何快速的组织和使用资源。
资源类型及结构布局
OPhone平台中有多种资源类型,例如字符串,图片等等。每种资源都有其固定的语法和格式,在应用程序的源代码目录中也有其特殊的位置。总的说来,资源以三种类型的文件存放在本地:XML文件,位图文件以及原始数据文件。下面简单介绍了每种资源的概念和目录布局,关于其语法请参考OPhone中语法相关的文档。
1. 资源类型
OPhone系统中的资源多种多样,包括表现为xml文件的color, string, dimension, animation, menus, layout等,也包括png, jpg, gif格式的图片(建议使用png格式),还包括原始数据文件,如包含一段声音的文件等等。
2. 资源目录组织
每种资源在源码目录中都有其特定的位置,它们的根目录是源码目录中的res/目录,资源打包工具(aapt)会根据其所在的子目录和文件格式对其进行编译。下面看一下res/目录的组织。
res/drawable/
res/layout/
res/values/
res/xml/
res/raw/
1)anim目录
该目录下存放着描述animation类型的xml文件。
2)drawable目录
该目录下存放着.png,.9.png,.jpg等图片文件。
3) layout目录
该目录下存放着屏幕UI的layout文件,格式为xml。
4)values目录
该目录下可以存放多种资源类型的xml文件,例如定义了数组的array.xml,定义了颜色的colors.xml,定义了dimension的dimnes.xml,定义了字符串的strings.xml,定义了style的styles.xml。
5)xml目录
该目录存放了用户自定义的xml文件。
6) raw目录
该目录可存放了用户的原始数据文件,如声音文件等,这些文件在编译应用程序过程中不被编译,直接加到apk文件中。
上述目录中的文件在编译应用程序的过程中会被aapt编译成特定的格式以加快访问速度,并打包成Zip文件。如下图所示,在编译过程中,aapt会为每个资源生成一个唯一的ID值,并产生一个包含这些ID信息的类R。应用程序的JAVA文件中通过R.java中定义的这些ID来访问资源。

3. 根据系统配置选择非常好的资源
为增加应用程序UI的美观,达到最好的人机交互体验,通常需要根据当前的系统配置选择非常好的的资源。这是通过创建与上述目录平行的目录并对目录名增加限定符来实现的。
例如,应用程序有如下的strings.xml:
<resources>
<string name="hello">Hello</string>
</resources>
现在想在系统是中文的时候显示“你好”而不是“Hello”,可以创建一个如下的strings.xml。
<resources>
<string name="hello">你好</string>
</resources>
然后在res目录下创建一个名为values-zh的目录,将该strings.xml文件放到这个目路中即可。最终的res目录结构如下所示。
values-en/
strings.xml
values-zh/
strings.xml
下表是限定符的类型和有效的值。

表1 资源目录限定词
带限定符的目录的命名规则:
- 限定符以“-”隔开。
- 限定符是大小写敏感的。
- 同一类限定符只能有一个值。
- 限定符可以有多个,但是必须按照上表中的顺序。
- res/目录下的子目录不能嵌套。
OPhone系统在运行的时候会按照当前的配置选择非常好的的资源,下面是一个例子。
例如当前屏幕像素密度为108dpi,语言为en,屏幕方向是port。有个资源myimage.png,在res目录下有如下结构:
res/drawable-en/myimage.png
res/drawable-port/myimage.png
res/drawable-port-92dpi/myimage.png
首先,删除不符合当前配置的资源。在例子中,由于屏幕像素密度是108dpi,所以剔除res/drawable-port-92dpi/myimage.png。
其次,选择跟当前配置匹配数目最多的。在本例中,res/drawable-en/myimage.png 和res/drawable-port/myimage.png各匹配一个,而res/drawable/myimage.png一个没有,所以被剔除。
最后,根据表1中的优先级,挑出非常好的的资源。在本例中,本地语言的优先级高于屏幕方向的优先级,故删除res/drawable-port/myimage.png,选择res/drawable-en/myimage.png。
资源管理的框架
资源管理的框架大致可以分为两层:Java层和Native层。Java层封装着访问各种资源的接口,而Native层则为Java层提供了对应的接口,提高访问资源的速度。如下图所示。

图2 资源管理的框架
1) Java层
a) 类Resources
Ophone为访问不同类型的资源提供了不同的接口,这些接口被封装在类Resources中。例如访问字符串的接口getString(),访问 drawable类型的接口getDrawable()等等。该类管理着另外两个重要的类Configuration和AssetManager。
b) 类Configuration
类Configuration保存了当前系统中的配置,例如字体,语言等等信息。
c) 类AssetManager
类AssetManager提供了以数据流方式访问应用程序资源的方法。它通过native的方法来实现访问资源。AssetManager管理的资源有两个来源:一个是应用程序的资源,通过访问应用程序的apk文件得到;另一个是系统的资源,通过访问包含系统资源的apk文件获得。
2) Native层
Native层负责管理相应的apk文件,如上面所述,有两个文件,一个是系统的apk文件,另一个是应用程序自身的apk文件。Native层会把资源组织成一个资源表(Resource Table)用来提高访问资源的速度。
如何访问资源
在理解了OPhone中资源的类型,布局和简单框架后,我们来看看如何访问不同类型的资源。
要访问某个资源,必须先知道该资源的ID。在Java程序中,应用程序自身的资源可以简单的通过R.resource_type.resource_name来引用;系统的资源必须通过android.R.resource_type.resource_name来引用。而在xml类型的资源文件中,应用程序自身的资源可以通过@resource_type/resource_name来引用;其它Package的资源必须通过@package:resource_type/resource_name来引用。例如,引用系统的资源必须通过@android:resource_type/resource_name来引用。其中,resource_type可以是如下表关键字中的一个。

其次,访问某种类型的资源,必须通过其相应的语法格式来访问和使用,体现在Java中就是调用Resources等类的相应接口,体现在xml类型的资源文件中就是使用特定的属性。
然后,必须得到与应用程序相关的Resources类的实例,该实例一般通过Context.getResources()获得。
下面简单介绍了访问几种常用的资源的常用接口,更详细的资料请参考Ophone SDK中Resources等类的相关接口文档。

结束语
OPhone平台中的资源组织和管理是一个很有趣也很有意义的话题,了解各种资源的布局、框架及其访问方法,有助于开发者快速开发自己的应用程序,开发出更友好的程序界面。本文限于篇幅仅做了简略的介绍,更详细的资料请参考其它OPhone开发文档。(作者:费建江)