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

有关于横竖屏切换网上有很多总结,很多以前的总结说横屏切换竖屏会走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生命周期

欢迎大家交流,有问题请指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值