当在活动A的基础上启动了活动B,活动A就进入了停止状态,这个时候由于系统内存不足,将活动A回收掉了,这个时候用户点击Back返回键,返回活动A,会出现什么情况呢?这个时候还是会正常显示活动A的,只是不会执行onRestart()方法,而是重新执行onCreate()方法,因为活动A在这个情况下会被重新创建一次。

可是如果活动A中保存有我们临时存储的数据,比如EditText中输入了临时数据,启动活动B后,系统把活动A回收了,这些临时数据也没有了,如何保存这个活动A中的临时数据呢?
通过查阅文档,我们知道,Activity中还提供了一个onSaveInstanceState()回调方法,这个方法可以保证活动被回收之前一定会调用这个方法
,因此我们可以通过这个方法来解决临时数据得不到保存的问题

onSaveInstanceState()回调方法会携带一个Bundle类型的参数,键值对形式存储数据(什么是Bundle,本文附件会进行解释),Bundle提供了一系列的方法用于保存数据,比如可以使用putString()方法保存字符串等等,这些方法需要传入两个参数,一个是键,这个键用于后面从Bundle中取值,第二个参数是我们真正要存储的数据。
在MainActivity的Java代码中重写onSaveInstanceState()方法,即可将临时数据保存,比如:
@override protected void onSaveInstanceState(Bundle outState){ super
.onSaveInstanceState(outState);//这里将我们临时输入的一些数据存储起来 String tempData =
"something you just typed"; outState.putString("data_key", tempData); }

如上代码即可存储数据,可是我们如何读取这些数据呢?回想我们在onCreate()方法也有一个Bundle类型参数,这个参数一般情况下都是null,如果我们在Activity被回收前通过onSaveInstanceState()方法保存了数据的话,那么这个参数就会携带之前保存的所有数据,我们通过对应的方法即可将这些数据取出来
比如:
@Override protected void onCreate(Bundle sacedInstanceState){ super
.onCreate(savedInstanceState); Log.i("MainActivity", "onCreate()");
setContentView(R.layout.activity_main);
//判断saveInstanceState是否为空,如果不为空则将对应数据取出赋值给tempData的引用 if(savedInstanceState !=
null){ String tempData = savedInstanceState.getString("data_key"); Log.i(
"MainActivity", tempData); } }
程序运行gif及控制台输出

注意,手机开发者选项设置只允许一个进程运行,这样可以保证我们输入临时数据后回到桌面,打开其他程序之后,之前的活动会被系统回收,临时输入会保存在Bundle中,当我们再次打开此程序时,程序会从之前保存的数据中取出之前的临时数据
通过下面的控制台输出我们可以看到在第二次打开此app是,执行的是onCreate()而不是onRestart(),说明之前的活动被系统回收了

gif


控制台
1、

2、

提示:
Intent也可以结合Bundle一起用于数据传递