单看标题可能不是很明确我要说的到底是什么,不如具体举一个场景的例子来说明
假设现在有两个Activity A跟B,当我们从A进入B一段时间后,由于内存资源不足等原因,系统可能会自动把activity A给回收了,这时我们按下back键想回到activity A,那么activity A执行的就不是onRestart方法,而是onCreate方法重新创建一次,这样的话我们之前A中的一些临时数据或者状态信息等可能就会丢失
那么,我们该如何对这些临时数据和状态进行保存呢?
Activity中提供了onSaveInstanceState回调方法,我们可以通过它保存临时数据和状态,方法中有一个Bundle参数,可以通过它的putString()、putInt()等方法传入需要保存的临时数据和状态。数据保存之后会在onCreate中恢复,onCreate也有一个Bundle类型的参数,通过它获取缓存下来的数据。
具体实现:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//当Acivity第一次被创建的时候为空,为了防止空指针,这里做判断
if( savedInstanceState != null ){
savedInstanceState.getString("data");
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("data","test data");
}
对于onSaveInstanceState方法,我们说它是在activity可能会被销毁的情况下被调用,那么具体哪些情况算是activity可能会被销毁呢?
1.按Home键,系统不确定按Hone键之后用户的其他操作是否会导致资源占用等问题从而使activity被销毁,所以调用onSaveInstanceState方法以防万一
2.按菜单键选择运行其他程序,原因与上一条差不多
3.按电源键锁屏
4.从当前activity跳转到一个新的activity
5.横竖屏切换,横竖屏切换时activity会销毁然后重新创建
总之,那些未经用户许可,而是由系统自动回收的activity都会在销毁前调用onSaveInstanceState方法对数据、状态进行缓存
onSaveInstanceState具体是在onStop方法之前调用,不确定是在onPause之前还是之后
当然如果是用户手动的进行activity的销毁,那么onSaveInstanceState方法就不会被调用,所以onSaveInstanceState的调用具有不确定性,所以我们不应该在该方法中进行一些永久性数据的保存,而应该放在onDestroy方法中
其实,activity还提供了onRestoreInstanceState回掉方法,它也有一个Bundle参数,作用就是用来恢复onSaveInstanceState中缓存的临时数据,但它与onSaveInstanceState不一定是成对出现的,只有activity真正的被系统销毁了它才会被调用,而且是在onStart方法后被调用
所以我们可以选择在onCreate方法或者onRestoreInstanceState方法中进行临时数据和状态的恢复。