前言

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

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

正文

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

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

onSaveInstanceState()

保存Acticivity被销毁前的状态。

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

  1. @Override
  2. protected void onSaveInstanceState(@NonNull Bundle outState) {
  3.   super.onSaveInstanceState(outState);
  4.   outState.putInt("oorr.cn", 111);
  5. }
复制

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

  1. 按Home

  2. 按Back

  3. 启动新的Activity

  4. 切换语言

  5. 屏幕旋转

执行顺序
  1. onPause() -> onStop() -> onSaveInstanceState() -> onDestroy()
复制

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

onCreate()

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

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3.   super.onCreate(savedInstanceState);
  4.   setContentView(R.layout.activity_main);
  5.   if (savedInstanceState != null ) {
  6.       int oorr = savedInstanceState.getInt("oorr.cn");
  7.   }
  8. }
复制

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

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

  1. 切换语言

  2. 旋转屏幕

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

onRestoreInstanceState()

恢复Acticivity被销毁前的状态。

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

  1. @Override
  2. protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
  3.   super.onRestoreInstanceState(savedInstanceState);
  4.   int oorr = savedInstanceState.getInt("oorr.cn");
  5. }
复制

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

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

  1. 切换语言

  2. 旋转屏幕

执行顺序
  1. 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
暂无评论...