Android 系统寻找匹配资源的逻辑

相关单位

我们常用的资源单位有px、dp、sp、dpi,如图:


Android 系统寻找匹配资源的逻辑_第1张图片
dpi && dp && sp

Context

我们知道 Context 提供访问应用独有资源的接口,如图:


Android 系统寻找匹配资源的逻辑_第2张图片
Context

但从 android R 之后只能从 Activity 或者 WindowContext 来访问资源(在多窗口模式下仅这其它 Context 获取的 Configuration 可能错误)。


Android 系统寻找匹配资源的逻辑_第3张图片
WindowContext

如需要在主屏幕上添加应用覆盖的窗口,需要用 Window Context 来 inflate view 和添加 window 到 WindowManager 以便在多窗口模式下也能获取到正确的资源:

final DisplayManager dm = anyContext.getSystemServer(DisplayManager.class);
final Display primaryDisplay = dm.getDisplay(DEFAULT_DISPLAY);
final Context windowContext = anyContext.createDisplayContext(primaryDisplay);
final View overlayView = Inflater.from(windowContext).inflate(layoutXml, null);

// WindowManager.LayoutParams initialization
...
mParams.type = TYPE_APPLICATION_OVERLAY;
...

mWindowContext.getSystemService(WindowManager.class).addView(overlayView, mParams);

Resources、Configurations、Assets

通过 Context 来到 Resources 后,我们会通过 Resources 拿到 AssetManager 去查找资源,那 Resources、Configuration、Assets 分别是什么呢?


Configuration && Resources && AssetManager.png

查询逻辑

以查找 dimens 资源为例,其流程如下:


Android 系统寻找匹配资源的逻辑_第4张图片
getDimension流程

简单来说分为三步:


Android 系统寻找匹配资源的逻辑_第5张图片
匹配资源流程

解析文件目录

解析顺序和流程如下:


资源配置限符解析过程

查找最优文件目录

顺序和流程如下:


资源配置限定符选择过程

参考:

Google Design Documentation
Google 官方:屏幕兼容性

你可能感兴趣的:(Android 系统寻找匹配资源的逻辑)