Activity被销毁后重新创建的数据存储和恢复

一、生命周期

一个Activity正常的生命周期应该是:

onCreate→onStart→onResume→onPause→onStop→onDestroy

以及还有一个onRestart方法会在Activity再次可见时调用:

onStop→onRestart→onStart

然而Activity可能会在系统配置发生改变以及内存不足的情况下被杀死,这时系统会调用onSaveInstanceState来保存当前Activity的状态。该方法的调用是在onStop之前,但它和onPause没有既定的时序关系,可能在onPause之前调用,也可能在onPause之后调用。当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。从时序上来说,onRestoreInstanceState的调用时机在onStart之后。

PS:onSaveInstanceState只会出现在Activity被异常终止的情况下,正常情况下系统不会回调该方法。

二、简单的存储与恢复

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_restore);
    if (savedInstanceState != null) {
        String data = savedInstanceState.getString("test");
        Log.d(TAG, "onCreate: "+data);
    }
}

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    super.onSaveInstanceState(outState, outPersistentState);
    Log.d(TAG, "onSaveInstanceState:");
    outState.putString("test","data");
}

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

上述代码很简单,我在onSaveInstanceState()方法中存储了一个字符串,然后当Activity被销毁并重新创建后,我们再去获取之前存储的字符串。接收的位置可以选择onRestoreInstanceState()或者onCreate(),二者的区别在于前者不需要判断传入的参数是否为空。

猜你喜欢

转载自blog.csdn.net/Ein3614/article/details/82666075