Android应用资源

资源限定符

限定符的优先级是:

  1. 移动国家代码MCC和MNC
  2. 语言和区域
  3. 布局方向 ldrtl和ldltr api17
  4. 屏幕最小尺寸swdp api13
  5. 最小可用宽度 wdp api13
  6. 最小可用高度 hdp api13
  7. 屏幕尺寸描述small normal large xlarge api4
  8. 屏幕纵横比 long notlong api4
  9. 圆形屏幕 round notround api23
  10. 屏幕方向 port land 受屏幕旋转影响
  11. UI模式 car desk television appliance watch api8
  12. 夜间模式 night notnight api8
  13. 屏幕像素密度 ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi nodpi tvdpi anydpi
  14. 触摸屏类型 notouch finger
  15. 键盘可用性 keysexposed keyshidden keyssoft
  16. 文本输入键盘 nokeys qwerty 12key
  17. 导航键可用性 navexposed navhidden
  18. 主要非触摸导航方法 nonav dpad trackball wheel
  19. 平台版本级别-Api级别

限定符匹配原则

  1. 按照优先级查找
  2. 除屏幕像素密度外,淘汰明确指定的限定符与设备设置冲突的资源文件
  3. 直至只剩下一个目录

处理运行时配置变更

有些设备配置可能会在运行时发生变化(例如屏幕方向、键盘可用性及语言)。 发生这种变化时,Android 会重启正在运行的 Activity(先后调用 onDestroy() 和 onCreate())。重启行为旨在通过利用与新设备配置匹配的备用资源自动重新加载您的应用,来帮助它适应新配置。

除了重启还要另外两种选择:

  1. 在配置变更期间保留对象
  2. 自行处理配置变更

使用Bundle在配置变更期间保存Activity数据的缺陷

  1. 无法保存大型对象如BitMap
  2. 保存和使用涉及序列换和发序列化,消耗大量内存并有性能瓶颈。

解决方案

使用Fragment可以在应用配置变更期间保留所有状态对象的引用,当 Android 系统因配置变更而关闭 Activity 时,不会销毁您已标记为要保留的 Activity 的Fragment。

  1. 扩展 Fragment 类并声明对有状态对象的引用。
  2. 在创建片段后调用 setRetainInstance(boolean)。
  3. 将片段添加到 Activity。
  4. 重启 Activity 后,使用 FragmentManager 检索片段。

注:从 Android 3.2(API 级别 13)开始,当设备在纵向和横向之间切换时,“屏幕尺寸”也会发生变化。因此,在开发针对 API 级别 13 或更高版本(正如 minSdkVersion 和 targetSdkVersion 属性中所声明)的应用时,若要避免由于设备方向改变而导致运行时重启,则除了 "orientation" 值以外,您还必须添加 "screenSize" 值。 也就是说,您必须声明 android:configChanges="orientation|screenSize"。但是,如果您的应用面向 API 级别 12 或更低版本,则 Activity 始终会自行处理此配置变更(即便是在 Android 3.2 或更高版本的设备上运行,此配置变更也不会重启 Activity)。

你可能感兴趣的:(Android应用资源)