Android Activity的横竖屏切换与状态保存

本文通过实例演示了Android应用在横竖屏切换时Activity生命周期的变化,并对比设置了android:configChanges属性前后的影响。此外还介绍了如何使用onSaveInstanceState方法保存状态。

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

记得之前参加了一场面试,其中一个问题;横竖屏切换的生命周期变化?
无奈平时开发没有接触到横竖屏切换,所以当时还真不清楚。
到底如何变化,还是自己手动写代码测试来的更舒服。
关于Activity周期不清楚的可以参见:
http://blog.youkuaiyun.com/demonliuhui/article/details/65631920

横竖屏切换的代码

代码很简单,重写Activity几个生命周期的方法即可。

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";


    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        Log.i(TAG, "onCreate------------");
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(TAG, "onRestart: --------------");
    }

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

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(TAG, "onPause: -----------------");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(TAG, "onStop: -------------------");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(TAG, "onDestroy: -----------------");
    }
 @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.i(TAG, "onConfigurationChanged: ");
    }
}
启动后连续旋转屏幕

这里写图片描述

设置android:configChanges=”orientation|screenSize”,连续旋转屏幕

关于onConfigurationChanged以及onConfigurationChanged 未被调用的问题

   <activity
            android:name=".MainActivity"
            android:configChanges="orientation|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

这里写图片描述

分析

根据上图的结果可知:
横竖屏切换的过程中生命周期的变化为:

onPause()----->onStop()------>onDestroy()-------->onCreate(Bundle savedInstanceState)------>onResume()

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期.
3、设置Activity的android:configChanges=”orientation|screenSize”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。

状态保存

添加如下代码,onSaveInstanceState(Bundle outState)在活动回收前一定会调用。

  @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
      Log.i(TAG, "onSaveInstanceState: ----------------");
        String s = "hello world!";
        outState.putString("text", s);
    }
获取保存的状态

看到onSaveInstanceState(Bundle outState)的函数名及参数类型,你一定会感到特别熟悉,没错,onSaveInstanceState(Bundle outState)中的outState参数,就是onCreate(Bundle savedInstanceState)中的savedInstanceState。
我们在在onCreate(Bundle savedInstanceState)中添加如下代码:

  if (savedInstanceState != null) {
            String s = savedInstanceState.getString("text");
            System.out.println(s);
        }
运行

这里写图片描述

根据上图可知,在进行横竖屏切换的过程中,也会调用onSaveInstanceState(Bundle outState)保存状态。然后在onCreate(Bundle savedInstanceState)中便可恢复状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值