Activity的横竖屏切换,之探索横屏切换竖屏切时会执行两次的理解

横屏切换竖屏切时会执行两次这个问题一直困扰着我,查了好多资料都无法验证,然后我就将生命周期全部重写,在不同的版本上运行查看日志。最终才发现,横屏切换竖屏执行两次并非所有版本都这样,在2.3版本及以后都验证这句话不符合,但当我尝试到2.2时发现的确这样,当屏幕旋转时会执行两次。

如果你有好奇心可以去下面地址下载android2.2的platforms


http://pan.baidu.com/s/1qXOdsBU



注意:测试需要改清单文件,否则会报错。


一下例子在android4.4上测试结果:

在清单文件中配置该属性:android:configChanges属性

总结:

1、不设置Activityandroid:configChanges切屏会重新调用各个生命周期切横屏时会执行一次切竖屏时会执行两次

2、设置Activityandroid:configChanges="orientation"切屏还是会重新调用各个生命周期切横、竖屏时只会执行一次

3、设置Activityandroid:configChanges="orientation|keyboardHidden"切屏不会重新调用各个生命周期只会执行onConfigurationChanged方法

注意:自从Android 3.2API 13),在设置Activityandroid: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的横竖屏切换,之探索横屏切换竖屏切时会执行两次的理解_第1张图片

横屏切换竖屏

运行中的activity----onPause-----onStop-----onDestroy-----onCreate------onStart---------onRsume

Activity的横竖屏切换,之探索横屏切换竖屏切时会执行两次的理解_第2张图片

注意:前三个和后三个不属于同一个生命周期。


android2.2测试结果:

注:仅仅输出了横屏切换竖屏

Activity的横竖屏切换,之探索横屏切换竖屏切时会执行两次的理解_第3张图片

android4.4仅仅横屏切换竖屏:

Activity的横竖屏切换,之探索横屏切换竖屏切时会执行两次的理解_第4张图片

另外,值得注意的是,生命周期的执行顺序有所不同,主要表现在onSaveInstanceState和onRestoreInstanceState

你可能感兴趣的:(android)