Android中有突发情况需要对数据进行保存:
1、点击back键 2、点击锁屏键 3、点击home键 4、其他APP进入前台 5、启动了另一个Activity 6、屏幕方向旋转 7、APP被Kill
这些时候就需要对数据进行保存,保存数据分为临时保存和持久化保存。
两种保存形式:
1、重写onSaveInstanceState() 在这个方法里进行对数据临时保存。
2、重写 onPause() 在这个方法里对数据进行持久化保存。
下面咱们详细说说这两种保存方式的步骤、什么情况下改用哪一种方法。
一、onSaveInstanceState()
先看官方给出的一张图:
再看官方的解释:
一般来说, 调用onPause()和onStop()方法后的activity实例仍然存在于内存中, activity的所有信息和状态数据不会消失, 当activity重新回到前台之后, 所有的改变都会得到保留.
但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该activity的实例对象了. 如果之后这个activity重新回到前台, 之前所作的改变就会消失. 为了避免此种情况的发生, 开发者可以覆写onSaveInstanceState()方法. onSaveInstanceState()方法接受一个Bundle类型的参数, 开发者可以将状态数据存储到这个Bundle对象中, 这样即使activity被系统摧毁, 当用户重新启动这个activity而调用它的onCreate()方法时, 上述的Bundle对象会作为实参传递给onCreate()方法, 开发者可以从Bundle对象中取出保存的数据, 然后利用这些数据将activity恢复到被摧毁之前的状态.
注:无法保证系统会在销毁您的 Activity 前调用 onSaveInstanceState()
,因为存在不需要保存状态的情况(例如用户使用“返回”按钮离开您的 Activity 时,因为用户的行为是在显式关闭 Activity)。 如果系统调用 onSaveInstanceState()
,它会在调用 onStop()
之前,并且可能会在调用 onPause()
之前进行调用。
不过,即使您什么都不做,也不实现 onSaveInstanceState()
,Activity
类的 onSaveInstanceState()
默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个 View
调用相应的 onSaveInstanceState()
方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。例如,EditText
小部件保存用户输入的任何文本,CheckBox
小部件保存复选框的选中或未选中状态。您只需为想要保存其状态的每个小部件提供一个唯一的 ID(通过android:id属性)。如果小部件没有 ID,则系统无法保存其状态。
尽管 onSaveInstanceState()
的默认实现会保存有关您的Activity UI 的有用信息,您可能仍需替换它以保存更多信息。例如,您可能需要保存在 Activity 生命周期内发生了变化的成员值(它们可能与 UI 中恢复的值有关联,但默认情况下系统不会恢复储存这些 UI 值的成员)。
由于 onSaveInstanceState()
的默认实现有助于保存 UI 的状态,因此如果您为了保存更多状态信息而替换该方法,应始终先调用 onSaveInstanceState()
的超类实现,然后再执行任何操作。 同样,如果您替换 onRestoreInstanceState()
方法,也应调用它的超类实现,以便默认实现能够恢复视图状态。
还可以通过将android:saveEnabled
属性设置为 "false"
或通过调用 setSaveEnabled()
方法显式阻止布局内的视图保存其状态。您通常不应将该属性停用,但如果您想以不同方式恢复 Activity UI 的状态,就可能需要这样做。
注:由于无法保证系统会调用 onSaveInstanceState()
,因此您只应利用它来记录 Activity 的瞬态(UI 的状态)— 切勿使用它来存储持久性数据,而应使用 onPause()
在用户离开 Activity 后存储持久性数据(例如应保存到数据库的数据)。
除了系统处于内存不足的原因会摧毁activity之外, 某些系统设置的改变也会导致activity的摧毁和重建. 例如改变屏幕方向, 改变设备语言设定, 键盘弹出等.
如果您对 Activity 进行了适当设计,让它能够按以上所述处理屏幕方向变化带来的重启并恢复 Activity 状态,那么在遭遇 Activity 生命周期中的其他意外事件时,您的应用将具有更强的适应性。
正如上文所述,处理此类重启的最佳方法是利用onSaveInstanceState()
和 onRestoreInstanceState()
(或 onCreate()
)保存并恢复 Activity 的状态。
一、onPause()
还是再看看官方提供的Activity的生命周期的那张图吧,一定要一个单词一个单词的读完哦。
关于onPause的特性:
onPause(), onStop(), onDestroy() are "killable after" lifecycle methods. This indicates whether or not the system can kill the process hosting the activity at any time after the method returns, without executing another line of the activity's code. Because onPause() is the first of the three, once the activity is created, onPause() is the last method that's guaranteed to be called before the process can be killed—if the system must recover memory in an emergency, then onStop() and onDestroy() might not be called. Therefore, you should use onPause() to write crucial persistent data (such as user edits) to storage. However, you should be selective about what information must be retained during onPause(), because any blocking procedures in this method block the transition to the next activity and slow the user experience.
翻译过来大概就是:无论出现怎样的情况,比如程序突然死亡了,能保证的就是onPause方法是一定会调用的,而onStop和onDestory方法并不一定,所以这个特性使得onPause是持久化相关数据的最后的可靠时机。当然onPause方法不能做大量的操作,这会影响下一个Activity入栈。
文章评论
This is the perfect way to break down this inonamrtifo.
Happy New Year and best wishes to you and your family. Thank you for all that you've shared here and over at Shutter Sirtess.
好文章,内容惜墨如金.禁止此消息:nolinkok@163.com
好文章,内容栩栩如生.禁止此消息:nolinkok@163.com