Android

来源:互联网 发布:成都人工智能公司 编辑:程序博客网 时间:2024/06/08 02:39

前言
  刚看到这个问题的时候,觉得横竖屏切换Activity的状态不会改变,所以测试了一下,才发现默认情况下每次横竖屏切换的时候,Activity都会销毁重新创建。因此,将这块内容记录下来,自己总结一下,并分享给大家。
  
1.代码部分

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        if (savedInstanceState != null) {            savedInstanceState.getString("name");            savedInstanceState.getInt("age");        }        Log.e("main","--------------onCreate");    }    @Override    protected void onStart() {        super.onStart();        Log.e("main","--------------onStart");    }    @Override    protected void onResume() {        super.onResume();        Log.e("main","--------------onResume");    }    @Override    protected void onPause() {        super.onPause();        Log.e("main","--------------onPause");    }    @Override    protected void onStop() {        super.onStop();        Log.e("main","--------------onStop");    }    @Override    protected void onRestart() {        super.onRestart();        Log.e("main","--------------onRestart");    }    @Override    protected void onDestroy() {        super.onDestroy();        Log.e("main","--------------onDestroy");    }    @Override    protected void onSaveInstanceState(Bundle outState) {        super.onSaveInstanceState(outState);        outState.putString("name","Lily");        outState.putInt("age",16);        Log.e("main","-------------->onSaveInstanceState");    }    @Override    protected void onRestoreInstanceState(Bundle savedInstanceState) {        savedInstanceState.putString("name","Lily");        savedInstanceState.putInt("age",16);        super.onRestoreInstanceState(savedInstanceState);        Log.e("main","-------------->onRestoreInstanceState");    }    @Override    public void onConfigurationChanged(Configuration newConfig) {        super.onConfigurationChanged(newConfig);        if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {            Log.e("main","横屏转竖屏");        } else if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {            Log.e("main","竖屏转横屏");        }    }

2.结果分析
以下测试结果都是在Android 6.0手机上测试得出:
(1)默认情况下,在AndroidManifest.xml中不设置Activity 的 configChanges属性,在横竖屏切换时,Activity每次都会执行一次完整的生命周期。
执行结果:
这里写图片描述

(2)在AndroidManifest.xml中设置Activity 的 configChanges属性为“orientation”,在横竖屏切换时,Activity每次也都会执行一次完整的生命周期。
执行结果:
这里写图片描述

(3)在AndroidManifest.xml中设置Activity 的 configChanges属性为“orientation|keyboardHidden”,在横竖屏切换时,Activity每次也都会执行一次完整的生命周期。
执行结果:
这里写图片描述

(4)在AndroidManifest.xml中设置Activity 的 configChanges属性为“orientation|keyboardHidden|screenSize”,在横竖屏切换时,Activity只会执行一次完整的生命周期,并且每次横竖屏切换时都会回调onConfigurationChanged方法。
执行结果:
这里写图片描述

3.总结
  只有在AndroidManifest.xml中设置Activity 的 configChanges属性为“orientation|keyboardHidden|screenSize”时,Activity的生命周期只执行一次,其他的都是在横竖屏切换时销毁Activity并重新创建,即每次都会执行一次完整的生命周期。
  不过在低版本的手机中,只需要设置 configChanges属性为“orientation|keyboardHidden”,Activity的生命周期就会只执行一次。
注意:
  当Activity横竖屏切换时,Activity会销毁并重新创建,那么,Activity销毁前的数据也会被销毁,所以当横竖屏切换时,我们需要在onSaveInstanceState方法中保存临时数据和状态,该方法会在活动销毁前回调。切换后,回调onRestoreInstanceState方法恢复数据和状态。


  如果有错误之处,请予以纠正,不要让错误之处误导他人。

原创粉丝点击