文档介绍:Android源码分析-资源加载机制oid源码分析-资源加载机制前言我们知道,在activity内部访问资源(字符串,图片等)是很简单的,只要getResources然后就可以得到Resources对象,有了Resources对象就可以访问各种资源了,这很简单,不过本文不是介绍这个的,本文主要介绍在这套逻辑之下的资源加载机制资源加载机制很明确,不同的Context得到的都是同一份资源。这是很好理解的,,而真正的实现位于ContextImpl中的getResources方法,在ContextImpl中有一个成员privateResourcesmResources,它就是getResources方法返回的结果,mResources的赋值代码为:mResources=((),,patInfo,activityToken);下面看一下ResourcesManager的getTopLevelResources方法,这个方法的思想是这样的:在ResourcesManager中,所有的资源对象都被存储在ArrayMap中,首先根据当前的请求参数去查找资源,如果找到了就返回,否则就创建一个资源对象放到ArrayMap中。有一点需要说明的是为什么会有多个资源对象,原因很简单,因为res下可能存在多个适配不同设备、不同分辨率、不同系统版本的目录,按照android系统的设计,不同设备在访问同一个应用的时候访问的资源可以不同,比如drawable-hdpi和drawable-xhdpi就是典型的例子。[java](StringresDir,intdisplayId,,IBindertoken){;=newResourcesKey(resDir,displayId,overrideConfiguration,scale,);;(this){8.//(false){(TAG,"getTopLevelResources:"+resDir+"/"+scale);11.}<Resources>wr=(key);=wr!=null?():null;14.//if(r!=null)(TAG,"isUpToDate"+resDir+":"+().isUpToDate());(r!=null&&().isUpToDate()){(false){(TAG,"Returningcachedresources"+r+""+.+":appScale="+().applicationScale);19.};21.}22.}.//if(r!=null){25.//(TAG,"Throwingawayout-of-dateresources!!!!"26.//+r+""+resDir);27.//}=newAssetManager();((resDir)==0){;32.}.//(TAG,"Resource:key="+key+",displaymetrics="+metrics);=getDisplayMetricsLocked(displayId);;=(displayId==);=();(!isDefaultDisplay||hasOverrideConfig){