onSaveInstanceState()和onRestoreInstanceState()

onSaveInstanceState(Bundle outState)在什么时机会被调用? 

onSaveInstanceState(Bundle outState)会在以下情况被调用: 
1、按下HOME键时。 
2、从recent中选择运行其他的程序时。 
3、按下power键时。 
4、一个activity启动一个另一个activity时。 
5、屏幕方向切换时。

onRestoreInstanceState什么时机被调用? 

onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建activity的情况下才会被调用。

屏幕方向切换时,activity生命周期如下:

onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume 

按HOME键,activity生命周期如下:

onPause -> onSaveInstanceState -> onStop -> onRestart -> onStart -> onResume 
因为activity没有被系统回收,因此onRestoreInstanceState没有被调用。

onCreate()使用Bundle参数恢复数据,和onRestoreInstanceState有什么区别?

因为onSaveInstanceState 不一定会被调用,所以onCreate()里的Bundle参数可能为空,如果使用onCreate()来恢复数据,一定要做非空判断。而onRestoreInstanceState的Bundle参数一定不会空,因为它只有在上次activity被回收了才会调用。

而且onRestoreInstanceState是在onStart()之后被调用的。所以需要onCreate()中做一些初始化完成之后再恢复数据,用onRestoreInstanceState会比较方便。

用onRestoreInstanceState方法恢复数据,可以决定是否调用父类的onRestoreInstanceState方法super.onRestoreInstanceState(savedInstanceState); 而用onCreate()恢复数据,你必须调super.onCreate(savedInstanceState); 
否则运行会报如下错误:android.util.SuperNotCalledException: Activity {com.example.test/com.example.test.SecondActivity} did not call through to super.onCreate()
 

你可能感兴趣的:(个人学习)