Android工程在运行的时候往往需要引用资源,这里的资源包括三种资源:系统资源、工程资源、第三方资源、插件资源等。不管是什么样的资源,最终都能通过一个入口来获取,而这个入口就是Resources对象。Resources对象描述了android资源文件,例如android工程下的res、asset目录等除了.class文件的资源,我们可以认为,所有涉及到获取资源的地方,都可以使用Resources来获取。事实上我们在代码中读取asset目录下的资源时常常直接使用Assetmanager来直接获取对象的流数据,但AssetManager也是属于Resources对象的一个属性,都同时指向相同的对象。

深入Resources源码的描述,Resources对象中有如下几个重要的成员属性:

/*package*/ static Resources mSystem = null;
/*package*/ final Object mAccessLock = new Object();/*package*/ final Configuration mTmpConfig = new Configuration();/*package*/ TypedValue mTmpValue = new TypedValue();
/*package*/ final AssetManager mAssets;private final Configuration mConfiguration = new Configuration();/*package*/ final DisplayMetrics mMetrics = new DisplayMetrics();private NativePluralRules mPluralRule;

上述mSystem为一个静态的对象,代表了系统默认的资源管理。

private Resources() {mAssets = AssetManager.getSystem();// NOTE: Intentionally leaving this uninitialized (all values set// to zero), so that anyone who tries to do something that requires// metrics will get a very wrong value.mConfiguration.setToDefaults();mMetrics.setToDefaults();updateConfiguration(null, null);mAssets.ensureStringBlocks();}

mAsset也指向了系统默认的实例,mAsset的创建初始化过程是在C++层做的。

我们在开发自己的应用时,常常是把自己需要的资源都放置到工程目录下的res文件夹下和asset文件夹下。当编译工程的时候,资源和源文件都将会打包到apk里面。运行应用的时候,Resources中AssetManager的路径默认指向了该apk的文件,如果是普通应用,一般apk文件被放置在data/app目录下,系统应用的apk包放在system/app下。所以在启动应用的时候,Resources通过Assetmanager,AssetManager再根据设定的路径查找apk中的资源,就可以正确的找到自己的资源了。

既然AssetManager获取资源是根据指向的路径来完成,所以理论上我们改变AssetManager读取的路径,就可以指定加载自己的资源,事实上也是这样设计的。所以如果我们让AssetManager指向自己设定的Apk资源路径,就可以完成提取apk资源的目的了。

新建一个用于管理资源的类ResourcesManager,其中包含的重要属性与方法:

AssetManager mAssetManager = null;Resources mResources = null;LayoutInflater mLayoutInflater = null;Theme mTheme = null;ClassLoader mClassLoader = null;String packageName = "com.example.testapk";String libPath = Environment.getExternalStorageDirectory().toString()+ File.separator + "ResApk.apk";protected void initAssetManager() {try {AssetManager assetManager = AssetManager.class.newInstance();Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);addAssetPath.invoke(assetManager, libPath);mAssetManager = assetManager;} catch (Exception e) {e.printStackTrace();}Resources superRes = super.getResources();mResources = new Resources(mAssetManager, superRes.getDisplayMetrics(),superRes.getConfiguration());}

mResources就指向了ResApk.apk里面的资源,通过名字就可以取得对应资源。

public int getDrawableId(String imgName) {return mResources.getIdentifier(imgName, "drawable", apkPackageName);}/*** 获取图片资源* * @param imgName* @return drawable*/public Drawable getResApkDrawable(String imgName) {return mResources.getDrawable(getDrawableId(imgName));}

特别需要注意的是,由于每个应用的上下文对象都是不一样的,要始终记住,如果使用的不是自己资源文件,要慎用与上下文有关的功能方法。

Android 资源管理利器Resources和AssetManager介绍相关推荐

  1. android资源管理方式,Android资源管理利器Resources和AssetManager

    Android开发 Android手机开发 Android应用开发 Android资源管理利器Resources和AssetManager 前言  : Android工程在运行的时候往往需要引用资源. ...

  2. Android 资源管理框架(Resources和AssetManager) 及 资源编译(aapt)

    android应用资源预编译,编译和打包全解析- https://cloud.tencent.com/developer/article/1033926   Android系统提供了一套强大的资源管理 ...

  3. Android资源管理中的SharedLibrary和Dynamic Reference-------之AssetManager的处理(四)

    我们先简要说一下AssetManager的一些常识,后面会有文章详谈. 首先,AssetManager在构造的时候,会把系统资源包也就是framework-res.apk加载进去,这里所谓的加载,就是 ...

  4. [免费专栏] Android安全之APK逆向入门介绍

    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 Android安全付费专栏长期更新,本篇最新内容请前往: [ ...

  5. 关于android 1.6全部的权限介绍

    原文:关于android 1.6全部的权限介绍 我们在 AndroidManifest.xml里需要对一些软件需要的操作做一些权限的声明, 比如我们的软件有发送短信的功能,那么就需要在 Android ...

  6. Android Coding利器之掌握小技巧,助你Coding更上一层楼~

    本文讲的是Android Coding利器之掌握小技巧,助你Coding更上一层楼~,话说前几天在网上浏览到一大牛写的关于Android布局优化的文章,看后感触很深,回过头看看自己写过的代码,发现还是 ...

  7. android.content.res.Resources$NotFoundException: Resource ID #0xfffffe6c (使用BaseRecyclerViewAdapt)

    错误:android.content.res.Resources$NotFoundException: Resource ID #0xfffffe6c 意思是资源ID找不到.然后又在报错中出现跟Bas ...

  8. Android 数据库查看工具Stetho使用介绍

    Android 数据库查看工具Stetho使用介绍 前言 使用工具 使用说明 添加依赖 注册声明 查看数据库 注意 完事 前言 毫无疑问,在做数据库开发的时候,开发人员总想能实时看到数据库的操作是否成 ...

  9. Caused by: android.content.res.Resources$NotFoundException: File res/drawable/main_tab_conversation_

    机型:coolpad 5951 <span style="color:#444444;">java.lang.RuntimeException: Unable to s ...

最新文章

  1. IOS使用正则表达式去掉html中的标签元素,获得纯文本
  2. 英特尔高管晒照片不小心泄密,正在研发的雷电5就这样暴露了
  3. Vs2008不能调试的问题
  4. mysql 时间函数多了8小时_MySQL时间函数了解
  5. python 从入门到实践 pdf_python入门基础实践课,带你有效的学习python
  6. JavaScript语言基础(二)
  7. 程序闪退_苹果APP日常使用时一直闪退怎么办?
  8. LintCode 547---两数组的交集
  9. (转)linux口令相关文件(/etc/passwd和/etc/shadow)
  10. SpringCloud 中使用 Ribbon(默认轮询规则 + 自定义规则)
  11. HDU 2899 :(二分求最小值)
  12. RANSAC算法理解
  13. MD5加密工具类(带盐值)
  14. 下列属于计算机应用,计算机的应用领域可大致分为6个方面,下列选项中属于计算机应用领域的是...
  15. QDUOJ 93 - 分辣条(01背包)
  16. 硬盘SMART检测参数详解[转]
  17. 买就赚到的以色列人工智能
  18. [Rootkit] dll 隐藏 - VAD
  19. Lidar Object detection
  20. 在html5页面中添加canvas,HTML页面中添加Canvas标签示例

热门文章

  1. 接收输入的一行字符,统计出字符串包含数字的个数 2、编写一个程序,计算字符串中子串出现的次数 3、请输入星期几的第1个字母,用来判断是星期几,如果第1个字母一样,则继续判断第2个字母,依次类推。
  2. NXP S32K1 FlexTimer模块
  3. 简述计算机用二进制的原因,简述计算机采用二进制的原因
  4. IT忍者神龟之小程序最全的微信小程序项目实例
  5. 关于Ubuntu下的PDF阅读器
  6. 苹果平板可以用html么,哪些苹果平板可以用苹果笔
  7. 单片机笔记十一:华大单片机
  8. 在C和C ++中创建循环缓冲区
  9. 最新系统漏洞--Google TensorFlow拒绝服务漏洞
  10. MATLAB画路径图(带结点,不同颜色的路径)