假设存在活动A和活动B;我们在活动A的基础上,启动了活动B,这时候,活动A就进入了停止状态;但是由于系统内存不足,将活动A回收掉了。如果我们在活动B中按下Back键返回A活动,会怎么样?
如果活动A没有被回收的话,会执行onRestart( )方法,但是被回收了之后,会执行onCreate( )方法;也就是说,活动A会被重新创建一遍,还是可以正常显示。
这样看上去好像没有什么问题
但是当活动A中还有数据没有保存,比如输入框中还有文字在编辑,那么也会全部丢失,这显然是十分烦人的。
解决方法:onSaveInstanceState( )方法
这个方法会保证在活动被回收之前被调用
onSaveInstanceState( )方法的参数
- Bundle类型的参数
Bundle类型提供了一系列方法来保存数据,例如:
- putString( ):保存字符串
- putInt( ):保存整型数据
这些保存方法都需要传入两个参数:
- 键值,用于之后查找取回数据
- 真正要保存的数据
以String类型为例:
@Override
protected void onSaveInstanceState (Bundle outState) {
super.onSaveInstanceState (outState) ;
String data_save = "Something you just typed" ;
outState.putString ("data_key" , data_save) ;
}
可以看出,数据已经被保存了下来;如果是输入框中的也是一样,将输入文本保存在里面。那么在哪里可以恢复呢?
我们注意到,onCreate( )方法中带有Bundle参数,一般情况下都是null;但是当有临时数据保存的时候,这个参数就会带有全部数据;所以,我们只需要在这里利用这个 Bundle参数就可以恢复了
@Override
protected void onCreate (Bundle savedInstanceState) {
……
if (savedInstaceState != null) {
String data_save = savedInstanceState.getString ("data_key") ;
Log.d ("A" , data_save) ;
}
}
可见,我们判断如果savedInstanceState不是null,说明带有了数据,然后调用它的getString( )方法,传入键值,就可以取出数据了