onRestoreInstanceState和onSaveInstanceState(Activity创建与恢复)

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方法,如果你知道验证的方法的话,谢谢你告诉我啦。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值