关于Activity横竖屏切换时生命周期发生的变化

  • 今天我们来记录一下当Activity横竖屏变化时Activity的生命周期的变化过程,记得以前面试的时候也被问过类似的问题,当时也不太清楚,今天刚好有时间就写个demo测试一下看看在横竖屏切换时,Activity生命周期到底发生了什么变化,话不多说先上代码,代码很简单只有一个Button点击事件,然后就是生命周期回调方法的Log打印
public class ScreenActivity extends AppCompatActivity {
    private static final String TAG = "ScreenActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_screen);
        Log.e(TAG, "onCreate: ");
        initListener();
    }

    /**
     * 横竖屏点击事件
     */
    private void initListener(){
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
                    //横屏
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                } else {
                    //竖屏
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                }
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e(TAG, "onStart: ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG, "onResume: ");
    }

    @Override
    protected void onPause() {i
        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 onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.e(TAG, "onRestoreInstanceState: ");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.e(TAG, "onConfigurationChanged: ");
    }
    
	 @Override
   	 protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.e(TAG, "onSaveInstanceState: " );
    }
}

  • 我们现在来测试一下,首先是竖屏状态下切换成横屏时Activity生命周期Log打印发生了什么变化

  • 首先Activity页面启动时触发的生命周期如下:
    在这里插入图片描述

  • 接着切换成横屏时触发生命周期
    在这里插入图片描述

  • 从Log中我们可以看到,在竖屏切换成横屏状态下,首先把当前Activity的实例给销毁掉,然后在重新创建实例,并且在onStop方法后有一个onSaveInstanceState方法回调,这个方法用处主要是保存当前状态,方便后面onRestoreInstanceState方法恢复状态,从这里我们可以看出竖屏切换横屏,先是将当前实例销毁,并在销毁前回调一个保存状态的方法,然后在重新创建实例并回调一个恢复状态方法

  • 接着我们来看从横屏状态下切换至竖屏下的变化
    在这里插入图片描述

  • 从上图来看和我们竖屏切换横屏生命周期方法一致,这里我们并没有在Manifest文件中添加什么设置,接下来我们从Manifest中Activity标签中添加如下设置:
    在这里插入图片描述

  • 我们再次启动一下看看切换横竖屏时生命周期的变化如何,首先是创建时:
    在这里插入图片描述

  • 接着我们试试切换横屏触发什么:
    在这里插入图片描述

  • 在上图中我们可以看到,经过我们在Manifest中设置配置后,切换横屏时并不走Activity的生命周期方法,而是回调了一个onConfigurationChanged方法,这个方法是当系统的配置信息发生改变时,系统会调用此方法。注意,只有在配置文件 AndroidManifest 中处理了 configChanges属性 对应的设备配置,该方法才会被调用。如果发生设备配置与在配置文件中设置的不一致,则Activity会被销毁并使用新的配置重建。

  • 在Manifest文件中设置了configChanges属性时,横屏切换至竖屏也是如此,这里就不在重复了,该属性配置不同时,Activity横竖屏切换时的生命周期也不不同,有兴趣的小伙伴可以自己去写个Demo测试一下,这里就不在一一陈述了。

  • 好了,今天的分享就到这里了,喜欢的小伙伴可以点个关注哈~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值