当你需要一个资源文件时,Android系统会在运行时根据当前设备的配置信息从你提供的资源中选择一个文件。为了呈现出Android系统是如何选择一个资源文件的这个流程,假定下面的每个drawable目录包含了相同的图片元素的不同像素版本:
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
同时,假定设备的配置信息如下:
Locale = en-GB
Screen orientation = port
Screen pixel density = hdpi
Touchscreen type = notouch
Primary text input method = 12key
通过比较设备的配置信息和可用的资源文件,Android系统从目录drawable-en-port中选择了图片资源。
系统选择出最佳匹配资源文件的算法思路如下:
1. 首先排除那些与设备的配置信息相矛盾的资源文件。
drawable-fr-rCA/ 目录被排除掉, 因为它跟设备的信息 Locale:en-GB 相矛盾。
drawable/
drawable-en/
drawable-fr-rCA/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
注意例外: 屏幕像素密度也是一个限制条件,如果还有目录没有被排除。 即使设备的屏幕密度是hdpi的, drawable-port-ldpi/目录不会被排除,因为每一个屏幕密度在这里被认为是一个点。 更多有用的信息请参考文档:Supporting Multiple Screens 。
2. 从列表中 (table 2)挑选(下一个)最高优先级的匹配项,进行匹配。
3. 是否没有资源文件目录包含这个限制条件?
o 如果没有, 返回第2步 ,同时看看下一个限制条件。在上面的例子中,很显然是“没有”,因此要循环到“语言”这个限制条件是才会遇到下一个限制条件。
o 如果有, 则转到第4步。
4. 排除那些没有包含限制条件的资源文件目录。在上面的例子中,系统会排除所有不包含“语言”这个限制条件的资源文件目录。
drawable/
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/
注意例外: 如果限制条件是屏幕像素密度, Android系统会选择跟设备的屏幕密度最相近的那一个。 通常, Android 系统更倾向于缩小一个较大的源图片而不是放大一个较小的源图片。参考 Supporting Multiple Screens。
5. 返回重复执行 2, 3 和4 步,直到仅有一个资源文件目录。在上面的例子中,“屏幕方向”是下一个需要比较的限制条件.。因此,排除那些没有指定屏幕方向的资源文件目录。
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
这样剩下的目录就只有drawable-en-port这一个了。
因为获取每个需要的资源文件的时候都要执行这个过程,所以需要进一步优化系统的一些不足的地方。 其中一个是,一旦知道了设备的配置信息后,系统会首先排除那些没有匹配项的资源文件目录。 例如, 如果设备配置信息中的“语言”是“英语”(“en”),则不要将那些包含了“语言”这个限制条件但却是其他语言信息的资源文件目录添加到待匹配的资源池中。尽管这样可能会留下那些没有“语言”这个限制条件的资源目录。
对“屏幕尺寸”这个限制条件进行匹配时,如果没有一个更好的资源文件时,系统会使用那些为比当前屏幕小的屏幕设计的资源文件 (例如,如果需要,一个large-size尺寸屏幕的设备会使用normal-size尺寸屏幕的资源文件)。但是,如果可以选择的资源文件所对应的屏幕尺寸都比当前屏幕的尺寸还大,此时系统不会使用这些资源文件,同时如果没有其他更好的资源文件可选的话,你的应用将会崩溃掉。(例如,如果所有的布局资源文件都是以xlarge 为标签的,而当前的设备屏幕是normal-size尺寸的。)
注意: 列表中(table 2)限制条件的优先级比限制条件的数量更加重要,尽管这些限制条件可能会跟设备的配置信息匹配的很好。比如,在第4步的之前,带匹配的资源目录中最后的一项包括三个限制条件(屏幕方向、触屏类型、输入法)可以跟设备信息匹配,但是 drawable-en 目录仅有一个匹配项(语言)。然而,“语言”拥有比其他几个限制条件更高的优先级,所以 drawable-port-notouch-12key 被排除掉。
要了解更多关于如何在你的应用中使用资源文件,请参考Accessing Resources。
附:算法流程图
翻译至:http://developer.android.com/guide/topics/resources/providing-resources.html