运行时配置改变
安卓针对语言、位置、硬件的运行时改变,会重启正在运行的activity. 这会强制Activty的资源被重新评估,然后为当前新配置选择最合适的资源值。
但是有时候这种默认的行为会让某些APP困扰,也许根本不准备做任何改变,典型的屏幕的横竖屏的切换。你可以自定义自己的回应方式,通过检测然后反馈。
那么Activity如何监听这种运行时的配置改变呢?
答:增加android:configChanges属性到mainfest的结点上,然后指定你想要监听的配置改变信息。(也就意味着被你监听的,系统就不自作主张了,你自己决定)
下面列出一些你能监听指定的配置改变项:
1.mcc、mnc----- SIM卡被检测到它的移动国家码和移动网络码发生改变。
2.locale 用户改变了当前设备的语言
3.keyboardHidden 键盘,d-pad,或者其它输入设备曝光或者隐藏
4.keyboard 键盘的类型发生改变;比如你的手机有一个12键的小型键盘,然后突然变成一个完整的键盘,或者一个额外的键盘插入。
5.fontScale 用户改变了字体大小
6.uiMode 当全局的UI模式发生改变 这主要发生在如果你切换 car(座机模式) 模式,或者切换白天和夜间模式等等。
7.orientation 不解释了
8.screenLayout 屏幕的布局发生改变。 典型的发生在不同的屏幕被激活。
9.screenSize 这属性是API level 12才引入的,发生在可用的屏幕大小发生改变,比如横竖屏切换。
10. smallestScreenSize 这属性是API level 12才引入的, 发生在物理屏幕尺寸发生改变,比如你的设备连接到其外接设备并显示。
在某些情况会同时出发多个事件,比如当用户划出一个键盘,很多设备会同时监听到keyboardHidden和orientation2个事件,要是post-Honeycomb MR2连接到额外的设备上,会触发screenSize ,smallestScreenSize,screenLayout,orientation事件。
那么说了这么多,mainfest文件中该如何配置呢? 看下面这段例子
<activity
android:name=”.MyActivity”
android:label=”@string/app_name”
android:configChanges=”screenSize|orientation|keyboardHidden”> 列出你要监听的事件
<intent-filter >
<action android:name=”android.intent.action.MAIN” />
<category android:name=”android.intent.category.LAUNCHER” />
</intent-filter>
</activity>
声明了之后activity中会出发onConfigurationChanged事件,重写这个事件,然后通过传递来的Configuration对象进行自我处理。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// [ ... Update any UI based on resource values ... ]
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// [ ... React to different orientation ... ]
}
if (newConfig.keyboardHidden == Configuration.KEYBOARDHIDDEN_NO) {
// [ ... React to changed keyboard visibility ... ]
}
}
再次注意:任何你不监听的配置发生改变都会造成activity的重启。