大家好,关于Android应用开发:深入探讨资源文件管理很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!
在上一篇文章中,我们已经提到了如何获取AssetManager实例。
mActivity.getAssets();mActivity.getResources().getAssets();
我们都是通过Activity实例对象直接或者间接获取AssetManager对象。那么我们应该知道,无论是getAssets()还是getResources(),它们都是android.app.Context类中定义的方法。 Context.java中的源代码:
公共抽象AssetManager getAssets();
公共抽象资源getResources();显然,两者都是通过abstract修饰的抽象方法。如果我们想知道它们的具体实现,那么我们就必须转向ContextImpl.java类。
注意:ContextImpl 类和 ReceiverRestrictedContext 类是写在一个java文件里的,查找的时候注意一下ContextImpl.java中的源代码:
@覆盖
公共AssetManager getAssets() {
返回getResources().getAssets();
}
@覆盖
公共资源getResources() {
返回mResources;
}意外的发现,其实获取AssetManager的方式是通过mActivity.getAssets(),即先获取Resources对象,然后调用Resources对象实例的getAssets()方法返回AssetManager实例。因此,表示为两种方式的源码流程其实是一样的。
既然它们都会生成Resources实例,那么我们就需要看看Resources从哪里来。
ContextImpl.java中的源代码:
私有ContextImpl(ContextImpl容器,ActivityThread主线程,
LoadedApk packageInfo、IBinder ActivityToken、UserHandle 用户、布尔限制、
显示显示,配置覆盖配置){
.省略多余的源代码
mResourcesManager=ResourcesManager.getInstance();
.
资源resources=packageInfo.getResources(mainThread);
如果(资源!=null){
if (activityToken!=null
|| displayId !=Display.DEFAULT_DISPLAY
||覆盖配置!=null
|| (compatInfo !=null compatInfo.applicationScale
!=resources.getCompatibilityInfo().applicationScale)) {
资源=mResourcesManager.getTopLevelResources(packageInfo.getResDir(),
packageInfo.getSplitResDirs(), packageInfo.getOverlayDirs(),
packageInfo.getApplicationInfo().sharedLibraryFiles,displayId,
覆盖配置、compatInfo、activityToken);
}
}
mResources=资源;
}参数packageInfo指向一个LoadedApk对象,该对象描述了当前的APK。用于访问资源的Resources对象作为调用参数传递
由packageInfo的成员函数getResources()创建。 Resources对象创建后,由于程序的其他设置可能发生变化,因此需要重新生成Resource。最终生成的对象会保存在ContextImpl类的成员变量mResources中。在生成Resources时最终会调用ResourcesManager.java类中的getTopLevelResources()方法。
ResourcesManager.java中的源代码:
资源getTopLevelResources(String resDir, String[] splitResDirs,
String[] OverlayDirs, String[] libDirs, int displayId,
配置overrideConfiguration, CompatibilityInfo compatInfo) {
最终浮点数=compatInfo.applicationScale;
配置overrideConfigCopy=(overrideConfiguration !=null)
?新配置(overrideConfiguration): null;
ResourcesKey key=new ResourcesKey(resDir, displayId, overrideConfigCopy, scale);
资源;
同步(这个){
//省略
AssetManager 资产=new AssetManager();
//如果“android”包正在创建新的资源对象,则resDir 可以为null。
//这很好,因为每个AssetManager 都会自动加载"android" 包
//已经。
if (resDir !=null) {
if (assets.addAssetPath(resDir)==0) {
返回空值;
}
}
如果(splitResDirs!=null){
for (字符串splitResDir : splitResDirs) {
if (assets.addAssetPath(splitResDir)==0) {
返回空值;
}
}
}
如果(overlayDirs!=null){
for (String idmapPath : overrideDirs) {
资产.addOverlayPath(idmapPath);
}
}
if (libDirs !=null) {
for (String libDir : libDirs) {
if (libDir.endsWith(".apk")) {
//避免打开我们知道没有资源的文件,
//就像纯代码.jar 文件。
if (assets.addAssetPath(libDir)==0) {
}
}
}
}
//Log.i(TAG, "Resource: key=" + key + ", 显示指标=" + 指标);
DisplayMetrics dm=getDisplayMetricsLocked(displayId);
配置配置;
最终布尔isDefaultDisplay=(displayId==Display.DEFAULT_DISPLAY);
最终布尔hasOverrideConfig=key.hasOverrideConfiguration();
if (!isDefaultDisplay || hasOverrideConfig) {
配置=新配置(getConfiguration());
如果(!isDefaultDisplay){
applyNonDefaultDisplayMetricsToConfigurationLocked(dm, config);
}
如果(hasOverrideConfig){
config.updateFrom(key.mOverrideConfiguration);
if (DEBUG) Slog.v(TAG, "Applied overrideConfig=" + key.mOverrideConfiguration);
}
} 别的{
配置=getConfiguration();
}
r=新资源(资产、dm、配置、compatInfo);
//省略
返回r;
}
}使用getTopLevelResources()获取Resources对象时,需要指定要获取的Resources对象对应的APK文件的路径。这个APK文件路径保存在LoadedApk类的成员变量mResDir中。这里可能还有其他资源路径。也可以添加。
这将创建一个Resources 实例对象。
然后,有了Resources对象,我们就可以直接调用getAssets()方法来获取AssertManager对象。
我们先看看AssetManager类的构造函数和成员函数addAssetPath的实现,然后再看看Resources类的构造函数的实现。
AssetManager.java 中的源代码:
公共AssetManager() {
同步(这个){
如果(DEBUG_REFS){
mNumRefs=0;
incRefsLocked(this.hashCode());
}
初始化(假);
if (localLOGV) Log.v(TAG, "新资产管理器: " + this);
确保系统资产();
}
}
//init 是一个本地方法
私有本机最终无效init(boolean isSystem);
私有静态无效EnsureSystemAssets() {
同步(sSync){
if (sSystem==null) {
AssetManager 系统=new AssetManager(true);
系统.makeStringBlocks(null);
sSystem=系统;
}
}
【Android应用开发:深入探讨资源文件管理】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
安卓开发真复杂!这些资源文件弄清楚了我才能继续开发啊。
有12位网友表示赞同!
终于找到一本关于 Android 资源文件的文章,之前一直很迷茫呢。
有18位网友表示赞同!
学习编程语言容易,但理解这种系统配置东西就比较抽象了。
有13位网友表示赞同!
想开发一款好用的 App ,资源文件也是不可或缺的关键啊!
有15位网友表示赞同!
项目过程中遇到很多资源文件的处理问题,看来要好好研究一下了。
有19位网友表示赞同!
图片、声音、字体这些资源文件怎么管理?这篇文档应该能解决我的问题。
有11位网友表示赞同!
学习 Android 开源项目时经常会遇到这些资源文件,不知道怎么理解它们的工作机制。
有13位网友表示赞同!
资源文件太重要了!一款优质的 App 不仅要功能强大,还要界面美观。
有9位网友表示赞同!
想让 App 更好玩,就需要丰富的资源文件支持吧!
有17位网友表示赞同!
最近在用 Kotlin 开发 Android 项目,遇到的问题就是关于资源文件的处理。
有19位网友表示赞同!
学习这些专业的知识真不容易,希望这篇文章能详细讲解资源文件的类型和使用方法。
有9位网友表示赞同!
Android 的资源文件种类很多,每次都要查文档实在太麻烦了!
有16位网友表示赞同!
理解资源文件对后续的开发工作非常重要,不能半途而废啊!
有8位网友表示赞同!
看了这个标题,感觉这篇文档应该很实用,期待深入了解 Android 资源文件的知识。
有12位网友表示赞同!
想成为一名合格的 Android 开发工程师,一定得掌握好这些基础知识。
有17位网友表示赞同!
以前没接触过 Android 项目,对资源文件一点都不了解,这下可以学习了!
有20位网友表示赞同!
资源文件的设计和管理直接影响到 App 的用户体验,需要认真对待。
有18位网友表示赞同!
Android 开发的门槛确实高,希望能够通过这篇文章快速入门。
有18位网友表示赞同!
我还在为如何优化 Android 项目的资源文件而苦恼,期待发现一些新思路!
有13位网友表示赞同!
学习好这些基础知识,才能更轻松地开发出优秀的 Android 应用!
有12位网友表示赞同!