保存 Activity 状态之——onSaveInstanceState()

写在这之前,先看一下官方文档的描述:

管理 Activity 生命周期的引言部分简要提及,当 Activity 暂停或停止时,Activity 的状态会得到保留。 确实如此,因为当 Activity 暂停或停止时,Activity 对象仍保留在内存中 — 有关其成员和当前状态的所有信息仍处于活动状态。 因此,用户在 Activity 内所做的任何更改都会得到保留,这样一来,当 Activity 返回前台(当它“继续”)时,这些更改仍然存在。

不过,当系统为了恢复内存而销毁某项 Activity 时,Activity 对象也会被销毁,因此系统在继续 Activity 时根本无法让其状态保持完好,而是必须在用户返回 Activity 时重建 Activity 对象。但用户并不知道系统销毁 Activity 后又对其进行了重建,因此他们很可能认为 Activity 状态毫无变化。 在这种情况下,您可以实现另一个回调方法对有关 Activity 状态的信息进行保存,以确保有关 Activity 状态的重要信息得到保留:onSaveInstanceState()

系统会先调用 onSaveInstanceState(),然后再使 Activity 变得易于销毁。系统会向该方法传递一个 Bundle,您可以在其中使用 putString() 和 putInt() 等方法以名称-值对形式保存有关 Activity 状态的信息。然后,如果系统终止您的应用进程,并且用户返回您的 Activity,则系统会重建该 Activity,并将 Bundle 同时传递给 onCreate() 和 onRestoreInstanceState()。您可以使用上述任一方法从 Bundle 提取您保存的状态并恢复该 Activity 状态。如果没有状态信息需要恢复,则传递给您的 Bundle 是空值(如果是首次创建该 Activity,就会出现这种情况)。

通过一个例子来说明其在生命周期中的位置(竖屏转为横屏):

10-11 10:01:29.827 10128-10128/com.bole.perfect D/debug: -->onCreate
10-11 10:01:29.833 10128-10128/com.bole.perfect D/debug: -->onStart
10-11 10:01:29.835 10128-10128/com.bole.perfect D/debug: -->onResume

横屏
10-11 10:01:32.000 10128-10128/com.bole.perfect D/debug: -->onSaveInstanceState
10-11 10:01:32.004 10128-10128/com.bole.perfect D/debug: -->onStop
10-11 10:01:32.005 10128-10128/com.bole.perfect D/debug: -->onDestroy
10-11 10:01:32.024 10128-10128/com.bole.perfect D/debug: -->onCreate
10-11 10:01:32.031 10128-10128/com.bole.perfect D/debug: -->onStart
10-11 10:01:32.031 10128-10128/com.bole.perfect D/debug: -->onRestoreInstanceState
10-11 10:01:32.033 10128-10128/com.bole.perfect D/debug: -->onResume


重要:在调用 onDestroy 后,该activity中的所有变量都将重置,而布局中的原有值(例如:edittext中的输入值)将会保存(前提是该view设置了 android:id)。

官方文档的说明:

不过,即使您什么都不做,也不实现 onSaveInstanceState()Activity 类的 onSaveInstanceState() 默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个 View 调用相应的 onSaveInstanceState() 方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。例如,EditText 小部件保存用户输入的任何文本,CheckBox 小部件保存复选框的选中或未选中状态。您只需为想要保存其状态的每个小部件提供一个唯一的 ID(通过 android:id 属性)。如果小部件没有 ID,则系统无法保存其状态。

扫描二维码关注公众号,回复: 4035269 查看本文章

:由于无法保证系统会调用 onSaveInstanceState(),因此您只应利用它来记录 Activity 的瞬态(UI 的状态)— 切勿使用它来存储持久性数据,而应使用 onPause() 在用户离开 Activity 后存储持久性数据(例如应保存到数据库的数据)。





猜你喜欢

转载自blog.csdn.net/hhbbeijing/article/details/78200406
今日推荐