前言
刚看到这个问题的时候,觉得横竖屏切换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方法恢复数据和状态。
如果有错误之处,请予以纠正,不要让错误之处误导他人。