应用资源:
- XML资源文件:存储应用所需的字符串、颜色和界面样式等交互界面相关的信息。可以分成两类,一类定义为列表型xml资源文件,该类型个的每个资源文件都存储了多个资源项;另一类定义为值类型xml资源文件,该类型的每个资源文件都仅代表一个资源项;
数据资源文件:应用中所需要使用的图像文件、音频文件、视频文件及其他格式的数据文件,每个数据资源文件都对应着一个资源项;
集中存放在mipmap或raw中,mipmap可以放置各种格式的图像文件,raw可以放置任意数据格式的文件,通常通过Resource.openRawResource函数进行读取。
asset目录也用于存储应用所需要的数据文件,但 并不属于Android资源系统的一部分,因此它不支持资源适配。但asset中可以包含自定义的多级目录结构,可以通过AssetManager对象对其进行读取,也可以利用Uri直接定位到其中的文件。anim:动画相关资源文件,每个动画资源问价都加载成Animation对象
- color:定义颜色信息的资源文件
- drawable:描述其他Drawable对象的资源文件
应用运行时,图像或图形文件都会加载成一个Drawable对象,位图数据文件会加载成BitmapDraawable对象,图形资源文件会加载成ShapeDrawable对象,状态选择器加载成StateListDrawable, - layout:界面资源文件,用于描述界面的控件信息
1)通过R类来设定界面控件,调用setContentView函数将R类中的界面描述设置到界面组件对象中
2)使用LayoutInflater类,可以将任意一个界面资源实例化成一个控件对象LayoutInflater.from(this).inflate();或者getLayoutInflater().inflate(); - menu:定义菜单样式
getMenuInflater.inflate(); - raw:图像、声频、视频等纯数据文件
- values:颜色值、字符串、数组等各种常量定义的资源文件
1)styles:样式资源,一组控件属性的集合;
2)attrs:描述自定义控件的可配置内容;
3)strings:字符串常量,colors:颜色常量,array:数组常量 - xml:包含搜索配置、应用设置信息等其他内容的资源文件
1.应用资源适配
为各个资源目录添加对应的适配资源目录,存放可替换的资源文件,适配不同的软硬件环境。
适配资源目录命名格式:资源目录-适配项1-适配项2
实际开发中,最常用的配置项有本地化相关资源的定义、不同屏幕尺寸的界面定制、不同分辨率设备的图片定制
2.应用资源动态匹配
在应用运行过程中,在界面组件默认设置中,任何设备配置发生变化前,Android都会强制回收当前与用户交互的界面组件对象,并在新的设备配置项下重新构造和恢复该组件对象。
1)快速缓存状态
设备配置项发生变化前,Activity.onRetainNonConfigurationInstance函数会被调用,该函数执行在Activity.onStop之后,Activity.onDestroy之前。
当设备配置变化完成后,界面组件对象会被重新构造,可以通过派生Activity.getLastNonConfigurationInstance函数来读取变化前保存的状态对象,将界面组件恢复到被销毁之前。
2)避免组件的销毁和重构
在配置文件中通过组件配置项中的android:configChangess属性声明不关注的设置配置项,一旦对应的配置项发生变化,Android就不会强制回收该组件,而是调用该组件的Activity.onConfigurationChanged函数通知配置变更事件,可以通过重载该函数来自定义变更逻辑
实际开发中,大部分配置项很少在运行时发变化,经常需要配置的只有oorientation和keybordHidden
3.应用资源的调用
预编译:在逻辑代码编译之前,事先进行一些操作将一些中间语言编写的内容转换成逻辑代码。比如描述进程间通信接口的AIDL文件也是通过预编译生成接口类代码的。
应用资源的预编译:利用Android SDK的appt工具对所以的应用资源目录结构和资源文件内容进行解析,编译生成R类和App._ap文件。
R类放置在gen目录下,每个资源目录或列表型xml资源文件,都会生成一个对应的静态内嵌类,每个资源目录中的文件和每个列表型xml资源文件的资源项对应相关内嵌类中的整数常量。
App._ap文件是是根据资源内容编译而成的二进制文件。
R类也会通过java编译器生成包含字节码的.class文件,利用Android SDK的dx工具,将所有.class文件汇集成一个Android定义的dex格式的文件;
当编译完成时,生成的dex文件、资源文件(包括App._ap及其他资源文件)、配置文件等,通过Android SDK提供的apkbuilder工具进行打包发布,最终生成.apk格式的安装包(本质上是一个zip文件),这个过程中App._ap文件会被进一步压缩,得到体积更小的resource.arsc文件;
在最终的安装包中,数据资源文件会被原封不动的保存,值类型的xml资源文件也会依照原有的目录结构合文件名放入安装包中,只是原有的xml格式内容会被压缩成特定的二进制流;列表型xml资源文件中的内容被全部编译到resources.arsc文件中去,不会再安装包中保留。
4.使用应用资源
1)通过资源管理对象Resources和R类,Resources类提供了一系列的get函数,用来读取各种类型的资源信息getResources().getString(R.string.name);
Resources对象还可以读取系统提供的资源信息,放置在android包中,对应的R类为android.R
2)通过R类直接给控件赋值
3)在资源文件中引用其他资源信息:@[包名]:资源类别/资源项
如果引用的资源位于本应用包中,包名可省略,但如果引用第三方资源,包名不可省略,如引用系统资源@android:drawable/btn_plus