Android 屏幕切换和onConfigurationChanged不调用的原因

Activity的生命周期大家都知道,通常我们会指定activity的屏幕方向,这样避免屏幕旋转改变后activity生命周期变化

      android:screenOrientation="portrait" 竖屏

      android:screenOrientation="landscape" 横屏


上面通过指定Activity显示屏幕方向,代码很方便也很多应用是这样做的,但是需求来时,需要应用自适应屏幕方向,这样我们就需要使用

android:configChanges这个属性了和在Activity重写onConfigurationChanged方法

例子:

android:configChanges="keyboardHidden|orientation"

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		// TODO Auto-generated method stub
		Log.i("UserInfoActivity", "onConfigurationChanged");
		if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
			Log.i("TAG", "横屏");
			// do some things
		} else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
			Log.i("TAG", "竖屏");
			// do some things
}super.onConfigurationChanged(newConfig);}


其中上述的super.onConfigurationChanged(newConfitg);方法是必须的,不能去掉,否者会有异常

      异常信息如下:

12-19 11:00:42.165: E/AndroidRuntime(20440): android.app.SuperNotCalledException: Activity ui.UserInfoActivity did not call through to super.onConfigurationChanged()


然而我们在实际使用时,系统版本大多不相同,在测试中本人在4.1系统中就出现了onConfigurationChanged方法不进入的情况,究其原因,在于

自从Android 3.2(API 13),screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion或者

TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation",你还必须设置"ScreenSize"。
解决方法:
AndroidManifest.xml中设置android:configChanges="orientation|keyboardHidden|screenSize"

当然我们也可以不指定TargetSdkVersion版本来这么做,也能达到大家的要求

你可能感兴趣的:(Android基础)