Android - Activity横竖屏切换时的生命周期

本文探讨了Android应用中Activity在横竖屏切换时的行为变化。通过不同配置设置,展示了Activity生命周期的变化规律及如何正确处理数据保存与恢复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言
  刚看到这个问题的时候,觉得横竖屏切换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方法恢复数据和状态。


  如果有错误之处,请予以纠正,不要让错误之处误导他人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值