资源限定符
限定符的优先级是:
- 移动国家代码MCC和MNC
- 语言和区域
- 布局方向 ldrtl和ldltr api17
- 屏幕最小尺寸sw<N>dp api13
- 最小可用宽度 w<N>dp api13
- 最小可用高度 h<N>dp api13
- 屏幕尺寸描述small normal large xlarge api4
- 屏幕纵横比 long notlong api4
- 圆形屏幕 round notround api23
- 屏幕方向 port land 受屏幕旋转影响
- UI模式 car desk television appliance watch api8
- 夜间模式 night notnight api8
- 屏幕像素密度 ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi nodpi tvdpi anydpi
- 触摸屏类型 notouch finger
- 键盘可用性 keysexposed keyshidden keyssoft
- 文本输入键盘 nokeys qwerty 12key
- 导航键可用性 navexposed navhidden
- 主要非触摸导航方法 nonav dpad trackball wheel
- 平台版本级别-Api级别
限定符匹配原则
- 按照优先级查找
- 除屏幕像素密度外,淘汰明确指定的限定符与设备设置冲突的资源文件
- 直至只剩下一个目录
处理运行时配置变更
有些设备配置可能会在运行时发生变化(例如屏幕方向、键盘可用性及语言)。 发生这种变化时,Android 会重启正在运行的 Activity(先后调用 onDestroy() 和 onCreate())。重启行为旨在通过利用与新设备配置匹配的备用资源自动重新加载您的应用,来帮助它适应新配置。
除了重启还要另外两种选择:
- 在配置变更期间保留对象
- 自行处理配置变更
使用Bundle在配置变更期间保存Activity数据的缺陷
- 无法保存大型对象如BitMap
- 保存和使用涉及序列换和发序列化,消耗大量内存并有性能瓶颈。
解决方案
使用Fragment可以在应用配置变更期间保留所有状态对象的引用,当 Android 系统因配置变更而关闭 Activity 时,不会销毁您已标记为要保留的 Activity 的Fragment。
- 扩展 Fragment 类并声明对有状态对象的引用。
- 在创建片段后调用 setRetainInstance(boolean)。
- 将片段添加到 Activity。
- 重启 Activity 后,使用 FragmentManager 检索片段。