微信号:androidwalker

介绍:关注Android新技术、进阶开发

大话Android 资源最佳匹配算法

2016-03-10 08:25 Android高级开发

当应用从可选的资源里面请求一个资源,Android系统选择哪里资源,依赖于当前设备的配置。为了阐述一下Android如何选择资源,做了如下drawble的示例(有多种可选资源):

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.

Android系统的最佳匹配查找算法逻辑如下:

1)排除与配置不相关限定符的资源.

首先先排除 drawable-fr-rCA/ 目录, 因为它不属于 en-GB 区域.

drawable/

drawable-en/

drawable-fr-rCA/

drawable-en-port/

drawable-en-notouch-12key/

drawable-port-ldpi/

drawable-port-notouch-12key/

 

Exception: 屏幕像素密度是唯一一个不会在这里被排除的限定符.即使当前屏幕的像素密度是hdpi, drawable-port-ldpi/ 还是不会被排除,因为在此时,所有的屏幕像素密度被认为还是可以匹配的.


2) 选择下一个优先级最高的限定符 (如上一章节提到的限定符表). (从MCC开始,一直往下遍历.)

3)有哪些资源目录包含这个限定符?

o    如果没有, 返回第2步,查找下一个限定符. (从上述例子可以看到,限定符是一直遍历到语言后,才找到匹配的.)

o    如果有, 之行第 4步.


4)排除那些没有包含这个限定符的目录. 在示例中,我们可以排除那些没有包含语言限定符的目录

drawable/
drawable-en/
drawable-en-port/
drawable-en-notouch-12key/
drawable-port-ldpi/
drawable-port-notouch-12key/


Exception: 如果遍历到屏幕像素密度。Android会选择最贴近的资源。如果被选择的资源比较大(当前mdpi,而选择是hdpi),Android会自动做按比例缩小,如果被选择的资源比较小(当前mdpi,而选择是ldpi),则会自动做按比例放大。

继续重复 2, 3, 4步骤,直到仅剩下一个目录 。如示例,屏幕方向是下一个限定符,所以,没有指定屏幕方向的资源目录都被排除掉:

drawable-en/
drawable-en-port/
drawable-en-notouch-12key/

因此,最终剩下的仅是 drawable-en-port.


虽然资源请求的流程大致如上,但系统会做一些优化。比如一旦配置已知,它可能会先排除一些已知永远无法满足的资源目录。 比如,配置的语言是英语 ("en"), 那些包含非英语限定符的资源目录就会被直接剔除掉 (但是,如果没有指定语言的还是会被继续保留).

当基于屏幕尺寸限定符选择资源, 如果当前没有非常合适的资源时,系统会选择比当前小的资源 (比如, 一个large-size屏幕将会选择normal-size屏幕资源,如果必要的话). 但是,如果当前可用资源却比当前屏幕大, 系统将会crash掉,报找不到资源 (比如,布局都设置为 xlarge 限定符类型, 但当前屏幕确实normal尺寸).

Note: 限定符的优先级顺序 (如上一章节提到的限定符) 比有多少个限定符匹配的上来的重要. 比如在上面第4)步骤, drawable-port-notouch-12key满足三个限定符(屏幕方向, 触摸类型,输入法), drawable-en 却只满足一个限定条件 (language). 然后, language 的优先级却比其他的限定符都高, 所以,反而排除了 drawable-port-notouch-12key .

注意事项


Android 1.5 和1.6: 采用精准匹配,而不是最佳匹配

由于版本太低,就不讲啦。。。


 
Android高级开发 更多文章 Android Studio 入门技巧之<基础篇> Android Studio 之<进阶篇:实用快捷键> Android Studio 之<进阶篇:IDE设置> 2015年度腾讯MIG内部技术峰会 多团队协同开发经验
猜您喜欢 多邻国团队的Swift项目实践 IBM推出基于行为数据的预测性行业解决方案 从贝叶斯的角度看正则项 福利来袭 | 抢邀请码赴技术创新大会——感受曙光的更快、更高、更强! 又碰Java启动性能问题