Android中onSaveInstanceState和onRestoreInstanceState

前言

本篇简单实践一下Android中Activity异常情况下生命周期中两个特别的方法,主要说明异常生命周期下是如何保存数据的

原理简单说明

当Activity在异常情况下需要重新创建时,系统会默认为我们保存当前Activity的视图结构,并在Activity重启后为我们恢复这些数据,比如文本框中用户输入的数据、ListView滚动的位置等,这些View相关的系统状态都能默认为我们恢复,具体到一个特定的view能够为我们恢复哪些数据,可以查看该View的源码。
关于保存和恢复View层次结构,系统的工作流程是这样的:首先Activity被意外终止时,Activity会调用onSaveInstanceState去保存数据,然后Activity会委托Window去保存数据,接着Window再委托它上面的顶级容器去保存数据,顶层容器是一个ViewGroup,一般就是DecorView,然后顶级容器再去一一通知它的子元素来保存数据,这样这个数据保存过程就完成了,具体到方法就是各个View中的onSaveInstanceState和onRestoreInstanceState,整个过程就是一种典型的委托思想。

代码如下

xml代码



    


注意给定的EditText的id,如果不设定id,那么系统是无法默认恢复EditText中输入的内容的

Activity代码

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);
        if(savedInstanceState!=null){
            Log.d(TAG, "onCreate: "+savedInstanceState.getString("extra"));
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("extra","111");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onRestoreInstanceState: "+savedInstanceState.getString("extra"));
    }
}

注意是这个方法onSaveInstanceState(Bundle outState),而不是onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState),后者Lolliop(API 21)之后的版本才有。

输出内容:

05-13 10:08:58.161 20732-20732/com.dhasa.restore D/MainActivity: onCreate: 111
05-13 10:08:58.165 20732-20732/com.dhasa.restore D/MainActivity: onRestoreInstanceState: 111

你可能感兴趣的:(Android中onSaveInstanceState和onRestoreInstanceState)