您的位置:首页 > 其它

横竖屏切换的引发的问题总结

2016-09-24 23:46 281 查看
有关于横竖屏切换网上有很多总结,很多以前的总结说横屏切换竖屏会走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生命周期

欢迎大家交流,有问题请指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息