前言

Android面试时问到onSaveInstanceState相关知识,因此今天抽空记录一下相关内容,方便后续自己查阅。

本文Activity是以默认的启动模式,也就是standard模式下测试的。

正文

对应Android中Activity状态的保存,主要涉及onSaveInstanceState(),onCreate()和onRestoreInstanceState()三个方法。

下面分别先介绍一下,然后但深入的分析相关内容。

onSaveInstanceState()

保存Acticivity被销毁前的状态。

在离开页面的时候用onSaveInstanceState中的outState可以保存你所需要的值。

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("oorr.cn", 111);
}

在测试中,发现很多情况下都会调用,下面简单列举几种情况:

  1. 按Home

  2. 按Back

  3. 启动新的Activity

  4. 切换语言

  5. 屏幕旋转

执行顺序
onPause() -> onStop() -> onSaveInstanceState() -> onDestroy()

虽然执行了onSaveInstanceState()并保存了数据,但onCreate()中的savedInstanceState还是可能为null或者onRestoreInstanceState()未必会被调用。

onCreate()

onCreate()是在活动或碎片首次创建时调用的,用于初始化界面和加载数据。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState != null ) {
        int oorr = savedInstanceState.getInt("oorr.cn");
    }
}

么次都会调用,但savedInstanceState可能为null。

savedInstanceState不为null情况下,暂时有如下情况:

  1. 切换语言

  2. 旋转屏幕

对于低内存被kill,重新打开会走的说法,暂时没看到。

onRestoreInstanceState()

恢复Acticivity被销毁前的状态。

在重新回到该页面的时候可以使用onRestoreInstanceState从saveInstanceState()中获取保存过得值来重新初始化界面。

@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    int oorr = savedInstanceState.getInt("oorr.cn");
}

虽然重写了,但不一定执行哈。

对于onRestoreInstanceState()调用,暂时有如下情况:

  1. 切换语言

  2. 旋转屏幕

执行顺序
onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()

小结

  1. onSaveInstanceState()虽然保存了数据,但onCreate中savedInstanceState未必有数据或onRestoreInstanceState()未必会被调用。

  2. 目前发现非人为下(切换语言,屏幕旋转等)销毁Activity,重启后onCreate中savedInstanceState不为null或onRestoreInstanceState()才会被调用。

  3. onSaveInstanceState()在onStop()之后调用,onRestoreInstanceState()在onStart()调用。

注意:onSaveInstanceState()是用来保存UI状态,onPause()适合用于数据的持久化保存。

参考文章

  1. Android系统之onSaveInstanceState用法及源码分析

  2. savedInstanceState always null in OnCreate although onSaveInstance is called

  3. 无法得到通过onSaveInstanceState()保存的Bundle数据

相关文章

暂无评论

none
暂无评论...