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

记得之前参加了一场面试,其中一个问题;横竖屏切换的生命周期变化?
无奈平时开发没有接触到横竖屏切换,所以当时还真不清楚。
到底如何变化,还是自己手动写代码测试来的更舒服。
关于Activity周期不清楚的可以参见:
http://blog.csdn.net/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 Activity的横竖屏切换与状态保存_第1张图片

设置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);
        }

运行

Android Activity的横竖屏切换与状态保存_第2张图片

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

你可能感兴趣的:(Android笔记)