有关于横竖屏切换网上有很多总结,很多以前的总结说横屏切换竖屏会走2次生命周期,然而测试时候不管任何切换仅仅走了一次,只有实践才能说明一切,在他们那个年代,我相信他们也是正确的,可能因为时间的推移api的改变导致的.
接下来开始几个小例子:
一.先总结下横竖屏切换输入框的保存状态
我用一个没有设置id的EditText,和一个设置了id的EditText,分别输入对应的文字(这里没有配置configchanges方法):
旋转后(不带id的消失):
总结:
默认状态下系统默认旋转时候,默认会保存有id的EditText的文字,没有设置id的EditText文字消失
二.总结下关于生命周期的变化
大家都知道,如果想解决横竖屏切换时,activity不重新创建,需要在manifest中配置 android:configChanges="orientation|keyboardHidden"
属性,当然在api>13的时候,你需要额外添加一个参数,就是 screenSize
,不添加这个,在api 13以上的手机是不会生效的。
然而有些App仅仅设置android:configChanges="orientation|keyboardHidden"
属性,然后就可以达到不重新activity创建,其实原因就在于targetSdkVersion 属性,如果小于12的话,仅仅设置orientation|keyboardHidden
属性即可达到不重新走activity生命周期方法,会走onConfigurationChanged,如果大于12的话,那么必须再加上screenSize
属性才能达到效果
以实例测试才能证明:
测试环境安卓5.0环境下,
测试代码:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, "onCreate:");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "onStart: ");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "onResume: ");
}
@Override
protected void onPause() {
super.onPause();
Log.e(TAG, "onPause: ");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "onStop: ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "onDestroy: ");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.e(TAG, "onSaveInstanceState: ");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.e(TAG, "onRestoreInstanceState: ");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.e(TAG, "onConfigurationChanged: ");
}
}
(1)清单没有配置任何configchange:
targetSdkVersion 12以及以下,结果如下:
targetSdkVersion 12以上(不包括12),结果如下:
(2)接下来清单文件配置android:configChanges=”orientation”
在targetSdkVersion12以及以下,结果如下:
在targetSdkVersion12以上会调用:
(3)接下来再配置:
android:configChanges=”orientation|keyboardHidden”
在targetSdkVersion12以及以下,结果如下:
在targetSdkVersion12以上会调用:
(4)接下来再配置:
android:configChanges=”orientation|keyboardHidden|screenSize”
在targetSdkVersion12以及以下,结果如下:
在targetSdkVersion12以上会调用:
结论:
1.切换横竖屏仅仅会调用一次生命周期方法
2.设置android:configChanges="orientation|keyboardHidden|screenSize"
,在targetSdkVersion12上下都表现为不重新创建,不会走生命周期,只会走onConfigurationChanged方法
3.不设置android:configChanges="orientation"
属性表现为都会重新创建activity,重走生命周期
4.设置了android:configChanges="orientation|keyboardHidden"
或android:configChanges="orientation"
在targetSdkVersion12以及以下(包含12)不会创建activity,重新走activity生命周期方法,会走onConfigurationChanged,如果大于12的话,重新创建,重走activity生命周期
欢迎大家交流,有问题请指正。