缓存activity的方法:.onSaveInstanceState和onRestoreInstanceState

有a、b两个activity,当a进入b之后的一段时间,可能系统就把a回收了,这时候按back键,执行的不是a的onStart()方法,而是onCreate()方法,a被重新创建了一次,这时a的临时数据和状态就很有可能就丢失了。
而Activity中的onSaveInstanceState()回调方法会保存临时的数据和状态,这个方法一定会再activity回收之前调用。方法中有一个Bundle参数,putString()、putInt()等方法需要传入两个参数,一个键一个值。数据保存之后会在onCreate中会恢复,onCreate也有一个Bundle类型的参数。
示例代码:
[java] view plain copy
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 当activity第一次被创建的时候为空
// 所以我们来判断一下
if(savedInstanceState != null){
savedInstanceState.getString(“anAnt”);
}
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putString(“anAnt”,”Android”);
}
一、onSaveInstanceState(Bundle outState) 用来保存状态
当某个activity变得“”容易“被系统销毁时,该activity的onSaveInstanceState()就会被执行,除非这个activity是被用户主动销毁的,例如用户按BACK键时。
“容易”被销毁时什么意思呢??
言下之意就是此时的activity还没有被销毁,而仅仅是一种可能性,这种可能性有哪些呢??通过重写一个activity的所有生命周期的onXXX()方法,包括onSaveInstanceState()和onRestoreInstanceState()方法,我们可以清楚的知道某个activity(假设为activity A)显示在当前task的最上层,其onSaveInstanceState()方法会在什么时候被执行,有这么几种情况:
1、当用户按下HOME键时。这是显而易见的,系统不知道当你按下HOME后要运行多少个其他的程序,自然也不知道activity A是否会被销毁,故系统会调用onSaveInstanceState,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则
2、长按HOME键,选择运行其他的程序时
3、按下电源按键(关闭屏幕显示)时
4、从一个activity A中启动一个新的activity时
5、屏幕方向切换时,l例如从竖屏切换到横屏时。(如果不指定configchange属性)在屏幕切换之前,系统会销毁activity A,在切换之后系统又会自动地创建activity A,所以onSavaInstanceState一定会被执行
总而言之,onSaveInstanceState的调用遵循一个重要原则,就是系统未经你允许就销毁你的activity,那么onSaveInstanceState一定会被系统调用,这是系统的责任,因为它必须要提供一个机会让你保存你的数据。另外,注意几点:
1.布局中的每一个view默认实现了onSaveInstanceState()方法,这样的话,这个UI的任何改变都会自动的存储和在activity重新创建的时候自动恢复。但是这个情况只有你为这个UI提供了唯一的ID之后才会起作用,如果没有ID,则不会存储它的状态
2.由于默认的onSaveInstanceState()方法实现了帮助UI存储它的状态,所以如果你需要覆盖这个方法去存储额外的状态信息时,你应该在执行任何代码之前都调用父类的onSaveInstanceState()方法,(super.onSaveInstanceState).
既然有现成的可以用,那我们到底要不要自己来实现onSaveInstanceState()方法呢??这个分情况而定,如果你自己的派生类中有变量影响到UI,或是你程序的行为,当然也要把这个变量也保存了,那么就需要自己实现,否则不需要。
3.由于onSaveInstanceState()方法调用的不可确定性,你应该只使用这个方法去记录activity的瞬间状态(UI的状态),不应该用这个方法去存储持久化数据。当用户离开这个activity的时候应该在onPause()方法中存储持久化数据(例如应该被存储到数据库中的数据)
4.onSaveInstanceState()如果被调用,这个方法会在onStop()前被触发,但是系统并不保证是否在onPause()之前或者是之后触发
二、onRestoreInstanceState(Bundle outState) 用来恢复数据
需要注意的是,onSaveInstanceState和onRestoreInstanceState并不一定是成对被调用的
onRestoreInstanceState()被调用的前提是,activity A 确实已经被销毁了,而如果仅仅是停留在可能情况下,那么该方法不会被调用。
例如,正在显示activity A 的时候,按下HOME键回到了主界面,然后紧接着又返回activity A,这种情况下,活动一般不会因为内存的原因而被系统销毁,故onRestoreInstanceState方法不会执行。
另外,onRestoreInstanceState的bundle参数也会传到onCreate()中,你也可以选择在onCreate()方法中做数据还原。此方法在onStart()方法之后执行。
以下的两个函数的使用,注意调用super的前后!!!!
[java] view plain copy
public void onSaveInstanceState(Bundle savedInstanceState){
savedInstanceState.putBoolean(“MyBoolean”,true);
saveInstanceState.putDouble(“MyDouble”,1.9);
savedInstanceState.putInt(“MyInt”,1);
savedInstanceState.putString(“MyString”,”Android”);
super.onSaveInstanceState(savedInstanceState);
}
public void onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedRestoreInstanceState);
boolean myBoolean = saveInstanceState.getBoolean(“MyBoolean”);
double myDouble = saveInstanceState.getDouble(“MyDouble”);
int myInt = saveInstanceState.getInt(“MyInt”);
}
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 当activity第一次被创建的时候为空
// 所以我们来判断一下
if(savedInstanceState != null){
savedInstanceState.getString(“anAnt”);
}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值