美文网首页
Android中onSaveInstanceState和onRe

Android中onSaveInstanceState和onRe

作者: dlihasa | 来源:发表于2019-05-13 10:30 被阅读0次

前言

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

原理简单说明

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

代码如下

xml代码

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/et"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

注意给定的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和onRe

      本文链接:https://www.haomeiwen.com/subject/hmakaqtx.html