横屏切换竖屏切时会执行两次这个问题一直困扰着我,查了好多资料都无法验证,然后我就将生命周期全部重写,在不同的版本上运行查看日志。最终才发现,横屏切换竖屏执行两次并非所有版本都这样,在2.3版本及以后都验证这句话不符合,但当我尝试到2.2时发现的确这样,当屏幕旋转时会执行两次。
如果你有好奇心可以去下面地址下载android2.2的platforms
http://pan.baidu.com/s/1qXOdsBU
注意:测试需要改清单文件,否则会报错。
一下例子在android4.4上测试结果:
在清单文件中配置该属性:android:configChanges属性
总结:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
注意:自从Android 3.2(API 13),在设置Activity的android:configChanges="orientation|keyboardHidden"后,还是一样会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。因此,阻止程序在运行时重新加载Activity,除了设置"orientation",你还必须加上"ScreenSize"。
不设置android:configChanges情况下:
测试代码:
public classMainActivity extends Activity {
privateString TAG="MainActivity";
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i(TAG,"onCreate");
}
@Override
protectedvoid onStart() {
super.onStart();
Log.i(TAG,"onStart");
}
@Override
protectedvoid onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.i(TAG,"onRestoreInstanceState");
}
@Override
protectedvoid onResume() {
super.onResume();
Log.i(TAG,"onResume");
}
@Override
protectedvoid onPause() {
super.onPause();
Log.i(TAG,"onPause");
}
@Override
protectedvoid onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG,"onSaveInstanceState");
}
@Override
protectedvoid onStop() {
super.onStop();
Log.i(TAG,"onStop");
}
@Override
protectedvoid onDestroy() {
super.onDestroy();
Log.i(TAG,"onDestroy");
}
}
屏幕切换activity的生命周期执行:
竖屏切换横屏:(结束掉当前activity,重新创建新的activity)
运行中的activity----onPause-----onStop-----onDestroy-----onCreate------onStart---------onRsume
横屏切换竖屏
运行中的activity----onPause-----onStop-----onDestroy-----onCreate------onStart---------onRsume
注意:前三个和后三个不属于同一个生命周期。
android2.2测试结果:
注:仅仅输出了横屏切换竖屏
android4.4仅仅横屏切换竖屏:
另外,值得注意的是,生命周期的执行顺序有所不同,主要表现在onSaveInstanceState和onRestoreInstanceState