onSaveInstanceState()方法

整理自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)方法。


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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值