Android通过终止、重启应用程序来重新加载资源文件,以做到对语言、区域和硬件实时变化的支持。它的默认的行为不是总是方便和令人满意的,尤其当配置变化(如屏幕方向和键盘可视)、用户旋转设备或划出键盘等。你可以通过监测和响应定制你的应用程序来对这些变化作出响应。
为了能让Activity能监听实时的配置变化,需要在manifest节点里添加“android:configChanges”特性,指定你要处理的配置变化事件。接下来的列表给出了你可以指定的配置变化的事件值:
❑ orientation 屏幕在纵向和横向间旋转。
❑ keyboardHidden 键盘显示或隐藏。
❑ fontScale 用户变更了首选的字体大小。
❑ locale 用户选择了不同的语言设定。
❑ keyboard 键盘类型变更,例如手机从12键盘切换到全键盘
❑ touchscreen或navigation 键盘或导航方式变化,一般不会发生这样的事件。
你可以选择捕获多个事件,通过在各事件值间使用“|”。接下来的代码片段显示了Activity要捕获屏幕方向和键盘可视的事件:增加这个特性就会强制应用程序在指定的配置变化时不用再重新启动,而是触发Activity中的onConfigurationChanged方法。
如下面的代码片段所示,override这个方法去捕获配置变化,通过传入的Configuration对象的值进行合适的处理。需要提醒的是需要调用父类的方法,并且要重新加载Activity使用的资源,以防有变更。
@Overridepublic void onConfigurationChanged(Configuration_newConfig) {
super.onConfigurationChanged(_newConfig);
[ ... 基于资源值更新UI ... ]
if (_newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
[ ... 对不同的屏幕方向作出处理 ... ]
}
if (_newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) {
[ ... 对键盘可见作出处理 ... ]
}
}
当onConfigurationChanged 被调用时,Activity的资源变量都已经用新的值进行了更新,所以它们是安全的。任何你没有显式指明的配置变化事件,都将由应用程序捕获,而且仍然会引起应用程序的重启,而不会调用onConfigurationChanged 方法。
// --------
Configuration 类中包含了很多种信息,例如系统字体大小,orientation,输入设备类型等等.
fontScale -- 来源于system.prop中 sys.font.scale配置项
输入设备类型配置:系统加入的任何输入device必须拥有输入属性:现在android中仅支持touchscreen(触摸),keyboard(键盘),navigation(滚动球)
orientation -- 屏幕方位
keyboardHidden -- 如果是划盖或开盖手机并且没有软键盘支持,这个设成true
hardKeyboardHidden -- 如果是划盖或开盖手机,这个设成true
locale -- 用户选择的location信息
theme -- 皮肤,资源等等
当Configuration改变后,ActivityManagerService将会发送"配置改变"的广播,会要求ActivityThread 重新启动当前focus的Activity.
// 这里还有一个不错的实例。
http://www.mobiletrain.org/lecture/doc/android/2011-07/625.html