前言
本篇简单实践一下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
网友评论