您的位置:首页 > 其它

onSaveInstanceState()方法

2016-08-04 11:52 246 查看
整理自http://www.cnblogs.com/xhj-records/archive/2013/02/28/2936373.html


*****onSaveInstanceState在 系统感觉 需要销毁Activity时调用*****



1、onSaveInstanceState() 方法的主要目的是保存和 Activity 的状态有关的数据。在 Activity可能被销毁前被调用来保存每个实例(这个“实例”指的是
Activity 对象所在的进程,因为Activity 的销毁是因为它所在的进程被杀掉而造成的)的状态,这样就可以保证该状态能够从 onCreate(Bundle) 或者onRestoreInstanceState(Bundle)恢复过来。(前后两个bundle是一样的).
保存的数据被传入一个参数Bundle(Bundle 被系统永久化),这个Bundle可以被认为是个 Map 字典之类的东西,用“键-值”的形式来保存数据。如果上次被销毁时没有保存 Bundle,则为 null。
2、 onPause() 在 Activtiy 被放置到后台或者自行销毁时总会被调用,onStop() 在 Activity 被销毁时被调用。这两个方法是生命周期中的方法,所以一定会被执行的。因此适合做数据的持久化保存(个人认为最好在onPause()中保存,习惯)。 如果onSaveInstanceState()被调用,这个方法会在 onStop() 前被触发,但系统并不保证是否在
onPause() 之前或者之后触发。通常onSaveInstanceState() 方法只适合用于保存一些临时性的状态(因为这个方法不一定会执行)。

Activity已经实现了onSaveInstanceState方法。默认的实现负责了大部分 UI 实例状态的保存,采用的方式是调用 UI 层上每个拥有 id 的 view 的 onSaveInstanceState()方法 ,并且保存当前获得焦点的 view
的 id
(所有保存的状态信息都会在默认的 onRestoreInstanceState(Bundle) 实现中恢复)。有名的保存,无名的不管。如果你自己的派生类中有变量影响到UI,或你程序的行为,可以自己重写这个方法来保存需要保存的数据。
3、Activity 中的 onSaveInstanceState() 方法和 onRestoreInstanceState() 不是生命中期中的方法,不一定会被调用,调用的时候也不会成对的调用。

onRestoreInstanceState被调用的前提是,activity A“确实”被系统销毁了,而如果仅仅是停留在有这种可能性的情况下,则该方法不会被调用,例如,当正在显示activity A的时候,用户按下HOME键回到主界面,然后用户紧接着又返回到activity A,这种情况下activity A一般不会因为内存的原因被系统销毁,故activity
A的onRestoreInstanceState方法不会被执行

另外,onRestoreInstanceState的bundle参数也会传递到onCreate方法中,你也可以选择在onCreate方法中做数据还原

其onSaveInstanceState方法会在什么时候被执行,有这么几种情况:

1.当用户按下HOME键时。 这是显而易见的,系统不知道你按下HOME后要运行多少其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则
2.长按HOME键,选择运行其他的程序时。
3.按下电源按键(关闭屏幕显示)时。
4.从activity A中启动一个新的activity时。 Activity A可能在内存中处于停止状态也可能由于新 Activity 需要更多内存而被系统销毁
5.屏幕方向切换时,例如从竖屏切换到横屏时。 Activity 会被销毁并重新创建

当应用遇到意外情况(如:内存不足、用户直接按Home键),(重要原则) 当系统“未经你许可”时销毁了你的activity,则onSaveInstanceState会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据

使用方法:

public class PreferencesActivity extends Activity {

private String name;

protected void onRestoreInstanceState(Bundle savedInstanceState) {

name = savedInstanceState.getString("name"); // 重新创建后恢复缓存的数据

super.onRestoreInstanceState(savedInstanceState);

}

protected void onSaveInstanceState(Bundle outState) {

outState.putString("name", "l_yqing"); // 被销毁前缓存一些数据

super.onSaveInstanceState(outState);//别忘了在你的实现中调用父类的 onSaveInstanceState() 方法

}

}

一个会调用 onPause() 和 onStop() 但不会触发 onSaveInstanceState() 的例子是--::--当用户从 Activity B 返回到 Activity A 时:没有必要调用 B 的 onSaveInstanceState(Bundle)方法,因为此时的 B 实例永远不会被恢复,因此系统会避免调用它。

一个调用 onPause() 但不调用 onSaveInstanceState(Bundle) 方法的例子是当 Activity B 启动后处在 Activity A 的前端:如果在B的整个生命周期里 A 的用户界面状态都没有被破坏的话,系统是不会调用 Activity A 的onSaveInstanceState(Bundle)方法。

个人整理,有些地方使用个人理解进行了裁剪,如有不对,欢迎指正。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: