浅谈OPhone OMS中的资源管理和使用

在资源类型及结构布局
1. 资源类型
2. 资源目录组织
 
 
res/anim/
res/drawable/
res/layout/
res/values/
res/xml/
res/raw/
anim
3)
layout目录
该目录下存放着屏幕UI的layout文件,格式为xml。
4)
5)xml目录
该目录存放了用户自定义的xml文件。
6)
raw目录
该目录可存放了用户的原始数据文件,如声音文件等,这些文件在编译应用程序过程中不被编译,直接加到apk文件中。
上述目录中的文件在编译应用程序的过程中会被aapt编译成特定的格式以加快访问速度,并打包成Zip文件。如下图所示,在编译过程中,aapt会为每个资源生成一个唯一的ID值,并产生一个包含这些ID信息的类R。应用程序的JAVA文件中通过R.java中定义的这些ID来访问资源。
 
3.
根据系统配置选择最佳资源
为增加应用程序UI的美观,达到最好的人机交互体验,通常需要根据当前的系统配置选择最佳的资源。这是通过创建与上述目录平行的目录并对目录名增加限定符来实现的。
例如,应用程序有如下的strings.xml:
 
Hello
现在想在系统是中文的时候显示“你好”而不是“Hello”,可以创建一个如下的strings.xml。
 
然后在res目录下创建一个名为values-zh的目录,将该strings.xml文件放到这个目路中即可。最终的res目录结构如下所示。
 
下表是限定符的类型和有效的值。
 
限定符
有效值
语言
语言码,遵循ISO 639-1标准,小写,如en, zh.
地区
遵循ISO 3166-1-alpha-2标准,大写,前面加小写的“r”,例如:rUS,rCN
屏幕朝向
port, land, square
屏幕像素密度
92dpi, 108dpi等
触摸屏类型
notouch, stylus, finger
键盘是否可用
keysexposed, keyshidden
首选的输入法
nokeys, qwerty, 12key
首选非触摸导航方法
nonav, dpad, trackball, wheel
屏幕尺寸
320x240, 640x480等,大尺寸必须在前
 
带限定符的目录的命名规则:
限定符以“-”隔开。 限定符是大小写敏感的。 同一类限定符只能有一个值。 限定符可以有多个,但是必须按照上表中的顺序。
res/目录下的子目录不能嵌套。OPhone系统在运行的时候会按照当前的配置选择最佳的资源,下面是一个例子。
例如当前屏幕像素密度为108dpi,语言为en,屏幕方向是port。有个资源myimage.png,在res目录下有如下结构:
 
首先,删除不符合当前配置的资源。在例子中,由于屏幕像素密度是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层提供了对应的接口,提高访问资源的速度。如下图所示。
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可以是如下表关键字中的一个。
anim
array
attr
bool
color
dimen
drawable
id
integer
layout
plurals
raw
string
style
xml                                                                                                                                                  表2 资源类型的关键字
其次,访问某种类型的资源,必须通过其相应的语法格式来访问和使用,体现在Java中就是调用Resources等类的相应接口,体现在xml类型的资源文件中就是使用特定的属性。
然后,必须得到与应用程序相关的Resources类的实例,该实例一般通过Context.getResources()获得。
下面简单介绍了访问几种常用的资源的常用接口,更详细的资料请参考Ophone SDK中Resources等类的相关接口文档。
1)
访问Color类型
Java接口:Resources.getColor
Java资源ID
R.color.resource_name
xml引用语法
@[package:]color:/resource_name
Java接口
Resources.getColor()
2)
访问String类型
Java资源ID
R.string.resource_name
xml引用语法
@[package:]string:/resource_name
Java接口
Resources.getString()返回纯字符串,Resources.getText()返回带有样式的字符串
3)
访问Drawables类型
 
Java资源ID
R.drawable.resource_name
xml引用语法
@[package:]drawable:/resource_name
Java接口
Resources.drawable()
4)
访问Animation类型
 
Java资源ID
R.anim.resource_name
xml引用语法
@[package:]anim:/resource_name
Java接口
请参考Ophone SDN中关于Animation的描述
 
结束语
OPhone平台中的资源组织和管理是一个很有趣也很有意义的话题,了解各种资源的布局、框架及其访问方法,有助于开发者快速开发自己的应用程序,开发出更友好的程序界面。本文限于篇幅仅做了简略的介绍,更详细的资料请参考其它OPhone开发文档。

你可能感兴趣的:(java,xml,package,name,限定符)