资源(Resources)是指应用中的图片、媒体文件、字符串、颜色值等。Android程序员在开发过程中随时要和Resources打交道,比如R.layout.activity_main、@string/hello……
一、Android应用资源的构成
Android系统提供了一套强大的资源管理框架Resources和AssetManager,下面我们从工程目录结构来学习下Android应用资源体系的构成,工程目录结构图如下:
从图中可以看到Android应用资源由两部分构成:资源目录和资源文件。
1、资源目录
资源目录就是res目录下的各个子目录,如anim、drawable、drawable-hdpi、layout、menu、raw、values等。这些目录都必须是系统预定义的,也就是说像res/drawable,res/layout都是合法的,而像res/kinbos、res/abcd都不是合法的,系统是识别不了的。无法在R类中生成相应的数据。
res/anim是存放动画相关资源的。
res/drawable是存放图片资源的。
res/layout是存放xml布局文件的。
res/menu是存放菜单样式资源的。
res/raw是存放音频、视频等纯数据文件资源的。
res/values是存放字符串、颜色值、数组等常量定义的文件的。
2、资源文件
资源文件就是资源目录下的数据文件,比如.xml、图片、音视频文件等。注意:资源文件只能放在资源目录下,而不能放在res目录下。
二、Android应用程序的编译步骤
这里之所以提到Android应用程序的编译步骤是因为Android对应用资源的处理贯穿了应用的整个开发流程的。下面我们按步骤Properties——>Builders打开工程的Properties对话框,截图如下:
Android应用程序的编译过程主要有以下4个步骤:
1、Android Resource Manager
Android通过aapt工具(aapt工具位于路径:[sdk目录]/build-tools/[android-xx])根据res目录下的资源在R类中生成与之相对应的嵌套子类及static final型常量。R.java文件代码如下:
package com.kinbos.note;
public final class R {
public static final class anim {
public static final int abc_fade_in=0x7f040000;
public static final int abc_fade_out=0x7f040001;
public static final int abc_slide_in_bottom=0x7f040002;
public static final int abc_slide_in_top=0x7f040003;
public static final int abc_slide_out_bottom=0x7f040004;
public static final int abc_slide_out_top=0x7f040005;
}
}
从上述代码中我们可以看出,res目录下的子目录是嵌套子类的类名,如代码中的anim,具体的文件名称是anim类的static final型常量。
2、Android Pre Compiler
这个步骤是将res目录下的文件资源编译成二进制格式。比如把.xml文件编译成二进制格式。注意:res/raw目录中的资源除外。
3、Java Builder
把.java源码编译成.class文件,包括R.java。
4、Android Package Builder
这个步骤是把.class文件编译成.dex格式的文件。.dex文件是Dalvik虚拟机所特有的文件格式,最后将.dex文件和其他文件打包成.apk文件。
为了更加简洁清晰的理解Android应用的编译和打包流程,我们将引用范怀宇著的《Android开发精要》一书里的一张插图来说明,如下图:
三、使用Android资源
1、从XML文件中调用资源
语法:@[包名]资源类型 / 资源名称
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/holo_blue_dark"
android:text="@string/hello_world" />
2、使用代码调用资源
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
四、assets和res的区别
1、res目录中的所有资源都会注册在R类中,可以通过R类直接调用;而assets中的资源则不会被注册在R类中,所以只能通过文件名引用。
2、assets目录中的文件和res/raw不做处理,所以在解压apk文件后可以看到原文件。
网友评论