惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
T
The Blog of Author Tim Ferriss
aimingoo的专栏
aimingoo的专栏
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
MongoDB | Blog
MongoDB | Blog
L
LangChain Blog
WordPress大学
WordPress大学
小众软件
小众软件
IT之家
IT之家
腾讯CDC
月光博客
月光博客
量子位
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 陈哈哈

Claude Code Windows 通知配置指南 Windows 上 agent-browser 使用问题排查与解决 踩坑实录:win11中Claude Code MCP 配置 context7 失败与调用问题全排查 Android N 多窗口模式,你需要知道的一切 Mac下设置Android源代码编译环境 Android编译过程中的碎碎念 编译Android AOSP代码 国内不FQ下载Android 源代码 android-plugmgr源代码分析 收集最好的Mac软件和使用方法 为什么使用Binder而不是其他IPC机制 Android什么时候进行View中Background的加载 Android属性动画源代码解析(超详细) Fragment提交transaction导致state loss异常 解决在onCreate()过程中获取View的width和Height为0的4种方法 【译】使用newInstance()来实例化fragment 【译】Activitys, Threads和 内存泄露 【译】什么导致了Context泄露:Handler&内部类 【译】用Fragment解决屏幕旋转(状态发生变化)状态不能保持的问题
Android怎么找到最优适配资源
陈哈哈 · 2014-12-22 · via 博客园 - 陈哈哈

当我们将一些提供了不同的资源文件可供Android系统选择的时候,Android会在运行时会根据一套适配的规则选择最符合当前配置的资源。为了说明Android怎么选择资源,假设我们有以下可选的资源文件目录,每一个目录都包含同一张图片的不同版本。

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/被排除了,因为它违背了Locale=en-GB 

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

 例外:屏幕像素密度(Screen pixel density) 这种限定词不会简单地因为跟当前系统配置不同而被排除。即使当前屏幕的配置是hdpidrawable-port-ldpi/不会被排除,因为每种屏幕密度都被认为可适配的。更多相关的信息查看Supporting Multiple Screens.

2、选出列表中(下一个)最高优先级限定词(开始于MCC,然后越往下越低)。

3、是否还有包含这个限定词的资源目录?

●否,返回步骤2然后查找下一个限定词(在例子中,答案是否,直到语言限定词被找到)。

●是,继续第4步。

4、排除没有包含这个限定词的资源文件目录。在这个例子中,系统排除了所有没有包含语言限定词的目录:

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

   例外:如果限定词是屏幕像素密度(device screen density),Android会选择最接近屏幕像素密度的一个。 总之,Android比较偏向于将原始的大图片缩放成 小的图片。 参考 Supporting Multiple Screens.

5、返回重复步骤23,和4知道只剩下一个目录。在这个例子中,屏幕方向是下一个用来匹配资源的限定词。所以,没有限定屏幕方向的资源文件目录就被排除了。

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

最后剩下的目录是drawable-en-port

虽然在请求每一个资源文件的时候都会执行上述的处理过程,但是系统自己会进行查找过程的优化。其中一个优化就是一旦系统的配置已经被加载,它可能会排除掉永远不会匹配的可选资源。比如,如果配置中的语言为英语(en"),那么任何其他有语言限定词又不是英语的就会从可选的资源目录池当中排除(但是如果资源目录中没有语言限定词,那么它依然是可选的)。

当根据屏幕大小选择资源的时候,如果找不到能跟当前屏幕匹配的资源,为比当前更小的屏幕设计的资源就会被使用(比如,一个large-size屏幕将会在必要的时候使用normal-size屏幕的资源文件)。然而,如果唯一可选的资源比当前的屏幕大,系统不会使用它们并且你的程序会崩溃如果没有其他的资源能够跟系统配置匹配(比如,所有的layout资源都有xlarge的限定,但是当前的设备屏幕是normal-size的)。

注意:在准确匹配资源上,限定词的优先级(在2)比限定词的数量更重要。例如,在上面的步骤4,列表中的最后一项还包含了三种能够准确匹配系统配置的资源(orientationtouchscreen typeinput method),然而drawable-en那项只有一项匹配(语言)。然而,语言有比其他限定词更高的优先级,所以drawable-port-notouch-12key就被排除了。

本文翻译自How Android Finds the Best-matching Resource