Android资源:包括图片、XML文件等资源。
APP在打包的时候,把这些资源索引全部打包进入resources.arsc文件中,在app加载资源的时候,就需要加载该文件中的索引找到文件进行加载。
代码中通过getResources()获得Resoures对象,在源码中其实是使用
通过context对象获取Resources我们随便看一个资源获取方法getString().
context 持有Resources 1 2 通过1,2图我们发现 本质是通过AssetManager类的方法来加载资源的 3 通过1,2,3图我们发现Resources类持有 ResourcesImpl ResourcesImpl 初始化的时候持有 AssetManager我们以Activity的资源创建为例
getOrCreateResources 创建 getOrCreateResources 方法中 createResourcesImpl创建 ResourcesImpl 对象 createResourcesImpl 方法中 createAssetManager创建AssetManager对象 把资源目录下的资源索引放入其中所以activity的资源加载就是加载mResDir路径目录下的资源。
拓展:
我们需要加载其他或者指定目录的资源:
可以通过自己创建的AssetManager对象,反射调用addAssetPath加载自己指定的目录,加载资源。
加载指定目录的资源但有时候这样加载资源并不能很好的完成需求,这个时候我们根据Context持有Resource,Resource持有ResourcesImpl ,ResourcesImpl 持有AssetManager,层层包装,我们可以根据需求向上包装完成需求,如插件化常常需要包装到Context层来加载资源(因为资源ID重复的问题,涉及到APP打包资源相关问题)。
raw 文件夹和 assets文件夹区别:
raw:android在编译的时候会为这个目录的文件夹生成一个ID,在XML使用资源的时候就可以通过这些ID来访问这些资源。直接通过ID访问,访问速度快。
assets:不会生成ID,只能通过AssetManager访问,因为没有ID所以XML中无法找到资源导致无法使用。访问速度慢。
网友评论