[翻译]Android如何匹配最佳的Resource?

原文节选How Android Finds the Best-matching Resource

当你请求使用一个非默认Resource时,Android会根据当前设备的配置,在运行时对Resource进行选择。为了阐明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

通过对比设备的配置和可用的Resource文件,Android最终选用了drawable-en-port文件夹下的drawables资源。

系统根据以下步骤来选用Resource文件:

1. 排除掉与设备配置不符的Resource文件。

drawable-fr-rCA/被排除了,因为它与设备配置矛盾。

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. 选取(下一个)最高权重的修饰符(从表格2中)(从MCC开始,往下取)。

表格见:AlternativeResources

3. 检查是否有Resource文件夹包含这个修饰符

如果没有,返回步骤2,使用下一个修饰符进行检查。(例子中,直到检查language修饰符之前结果都是“没有”)。

如果有,继续进行步骤4。

4. 排除掉不包含这个修饰符的Resource文件夹。例子中,系统排除掉所有不含language修饰符的文件夹:

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”,那么所有含有非‘en’语言修饰符的资源文件便不会参与上述匹配过程(虽然不含任何语言修饰符的资源仍然会被检索匹配)。

当根据分辨率这个修饰符选取资源文件时,若没有适配当前设备分辨率的文件夹,系统会选取更小一点的分辨率的资源文件夹(例如,一个large-size的设备在必要情况下会选取normal-size文件夹下的资源文件)。然而,如果当前可用的唯一资源文件夹比当前设备的屏幕规格要大,那么系统不会使用这个资源,而是直接crash(例如所有资源文件都含有xlarge修饰符,但是当前设备是一个normal-size screen设备)。

注意:修饰符的权重远比修饰符匹配的数量要重要。在例子中,进行到步骤4的时候,剩下的资源文件夹(drawable-en-notouch-12key/)匹配了3个修饰符,而drawable-en仅匹配了一个修饰符(language)。但由于language的权重比其余三个要高,所以drawable-en-notouch-12key/被排除了。

想知道更多关于Resource的知识,继续阅读文档Accessing Resources

python版qq音乐电台及android控制端

python版qq音乐电台

熬了几天夜,分析了qq电台的api,用python实现了基于http协议的qq音乐电台服务。代码共享到github上:

https://github.com/legendmohe/qqfm/

使用方式如下:

开启服务

注意,本项目依赖于 mplayer 和 tornado,要事先安装好。

随机下一首

如果要指定类别下随机下一首,则:

暂停

标记当前播放

获取类别列表

android控制端

代码同样地共享到 github:

https://github.com/legendmohe/QQFM_Android

该版本实现了上述接口的功能。不过代码和界面都比较粗糙。

收工!