onSaveInstanceState()方法的作用:
- 给Bundle对象中保存相应的 instance state (指的是key-value pairs),这样当activity重新创建的时候,就可以通过获取bundle中存储的值,恢复到自己之前的状态
onRestoreInstanceState()方法的作用
- 获取bundle中存储的instance state ,通过存储的值将activity恢复到我们期望的状态
两种方法的调用时机:
-
onSaveInstanceState()的调用时机即上图中的 1:
当前的acitiity从Resumed状态(完全可见的状态)进入后台运行,或者当前的活动被系统回收,系统会在调用了onStop()方法之后调用onSaveInstanceState()方法,例如跳转到其它的activity或者点击Home,但是如果是按下back键或者代码中调用finish()函数,这样的话activity是无法再恢复的,所以不会调用onSaveInstanceState()方法保存相应的信息。 -
onRestoreInstanceState()的调用时机即上图中的 2:
当系统将我们的activity回收,并重新恢复的时候,会在Created状态之后调用onStart()方法,然后调用onRestoreInstanceState()方法,比如屏幕旋转的时候会调用onRestoreInstanceState()。但是activity进入后台再到可见的时候并不会调用onRestoreInstanceState()。系统仅仅会在存在需要恢复的状态信息的时候调用onRestoreInstanceState(),因此在onRestoreInstanceState()方法中我们不需要判断bundle是否为null,这也意味着,调用了onRestoreInstanceState()那onSaveInstanceState()方法也必定调用过。但是如果是在onCreate()中恢复Bundle中的数据,那么我们就需要考虑Bundle是否为null。
代码实践:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class Main2Activity extends AppCompatActivity {
private static final String TAG = "Main2Activity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Log.d(TAG, "onCreate: ");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart: ");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume: ");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// 去恢复父类的相应的层次结构
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, "onRestoreInstanceState: ");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: ");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
Log.d(TAG, "onSaveInstanceState: ");
// 存储相应的层次结构
super.onSaveInstanceState(outState);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: ");
}
}
- 回到home的输出:
2019-12-07 14:39:15.695 2928-2928/com.example.lxd.fragmentlearn D/Main2Activity: onCreate:
2019-12-07 14:39:15.702 2928-2928/com.example.lxd.fragmentlearn D/Main2Activity: onStart:
2019-12-07 14:39:15.706 2928-2928/com.example.lxd.fragmentlearn D/Main2Activity: onResume:
2019-12-07 14:39:20.502 2928-2928/com.example.lxd.fragmentlearn D/Main2Activity: onStop:
2019-12-07 14:39:20.503 2928-2928/com.example.lxd.fragmentlearn D/Main2Activity: onSaveInstanceState:
可以看到调用了onStop()方法之后调用onSaveInstanceState。
- 点击back键输出
2019-12-07 14:40:11.914 3414-3414/? D/Main2Activity: onCreate:
2019-12-07 14:40:11.921 3414-3414/? D/Main2Activity: onStart:
2019-12-07 14:40:11.926 3414-3414/? D/Main2Activity: onResume:
2019-12-07 14:40:14.080 3414-3414/com.example.lxd.fragmentlearn D/Main2Activity: onStop:
2019-12-07 14:40:14.086 3414-3414/com.example.lxd.fragmentlearn D/Main2Activity: onDestroy:
并没有调用onSaveInstanceState.
同时对于上面的两种情况,再打开activity时也都是没有执行onRestoreInstanceState方法的。
- 旋转屏幕
2019-12-07 14:44:27.636 5123-5123/com.example.lxd.fragmentlearn D/Main2Activity: onCreate:
2019-12-07 14:44:27.642 5123-5123/com.example.lxd.fragmentlearn D/Main2Activity: onStart:
2019-12-07 14:44:27.647 5123-5123/com.example.lxd.fragmentlearn D/Main2Activity: onResume:
2019-12-07 14:44:30.394 5123-5123/com.example.lxd.fragmentlearn D/Main2Activity: onStop:
2019-12-07 14:44:30.394 5123-5123/com.example.lxd.fragmentlearn D/Main2Activity: onSaveInstanceState:
2019-12-07 14:44:30.397 5123-5123/com.example.lxd.fragmentlearn D/Main2Activity: onDestroy:
2019-12-07 14:44:30.615 5123-5123/com.example.lxd.fragmentlearn D/Main2Activity: onCreate:
2019-12-07 14:44:30.620 5123-5123/com.example.lxd.fragmentlearn D/Main2Activity: onStart:
2019-12-07 14:44:30.623 5123-5123/com.example.lxd.fragmentlearn D/Main2Activity: onRestoreInstanceState:
2019-12-07 14:44:30.625 5123-5123/com.example.lxd.fragmentlearn D/Main2Activity: onResume:
旋转屏幕会调用onRestoreInstanceState方法,同时在onRestoreInstanceState方法调用之前,调用了onSaveInstanceSate方法,但是这个例子并没有说明系统一定会在onRestoreInstanceSate之前调用onSaveInstanceState方法,如果你知道验证的方法的话,谢谢你告诉我啦。