假设我们在使用activityA  这时来了一个电话,当再次回来时activity A执行的就不是onRestart方法,而是onCreate方法重新创建一次,这样的话我们之前A中的一些临时数据或者状态信息等可能就会丢失

那么,我们该如何对这些临时数据和状态进行保存呢?

Activity中提供了onSaveInstanceState回调方法,我们可以通过它保存临时数据和状态,方法中有一个Bundle参数,可以通过它的putString()、putInt()等方法传入需要保存的临时数据和状态。数据保存之后会在onCreate中恢复,onCreate也有一个Bundle类型的参数,通过它获取缓存下来的数据。

Activity 的onSaveInstanceState和onRestoreInstanceState 并不是和onCreate()、onStart()等生命周期方法一样,按一定顺序执行。这两个方法不一定每次都会执行,它们只有在特定情况下才会触发。如果当用户主动去销毁Activity时,是不会被调用的。所以通常情况下onSaveInstanceState只适合保存一些临时的状态,而onPause()适合用于数据的持久化保存。

其实,activity还提供了onRestoreInstanceState回掉方法,它也有一个Bundle参数,作用就是用来恢复onSaveInstanceState中缓存的临时数据,但它与onSaveInstanceState不一定是成对出现的,只有activity真正的被系统销毁了它才会被调用,而且是在onStart方法后被调用

所以我们可以选择在onCreate方法或者onRestoreInstanceState方法中进行临时数据和状态的恢复。

1. @Override  
2. protected void onCreate(Bundle savedInstanceState) {  
3. super.onCreate(savedInstanceState);  
4.         setContentView(R.layout.activity_main);  
5. //当Acivity第一次被创建的时候为空
6. if( savedInstanceState != null ){  
7. "data");  
8.         }  
9.     }  
10.   
11. @Override  
12. protected void onSaveInstanceState(Bundle outState) {  
13. super.onSaveInstanceState(outState);  
14. "data","test data");  
15.     }

应用场景

1.按Home键,系统不确定按Hone键之后用户的其他操作是否会导致资源占用等问题从而使activity被销毁,所以调用onSaveInstanceState方法以防万一

2.横竖屏切换,横竖屏切换时activity会销毁然后重新创建

3.按电源键锁屏

4.从当前activity跳转到一个新的activity

总之,那些未经用户许可,而是由系统自动回收的activity都会在销毁前调用onSaveInstanceState方法对数据、状态进行缓存