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版本来这么做,也能达到大家的要求