1.onSaveInstanceState(Bundle outState)与onRestoreIntanceState(Bundle savedInstanceState)什么情况下调用?
系统只会在Activity即将被销毁并且有机会重新显示的情况下才会去调用它,比如说,旋转屏幕,Activity异常销毁同时会立刻创建新的Activity实例。
这个与用户交互Activity正常销毁不同.所以可以简单的理解为Activity只会在异常终止的时候才会调用onSaveInstanceState和
onRestoreIntanceState来恢复和存储数据。其他情况不会触发这个过程.
异常情况下:
Activity终止,系统会调用onSaveInstanceState来保存当前Activity的状态,这个方法调用时机是在
,当Activity被重新创建后,系统会调用onRestoreIntanceState,并且把之前Activity销毁时
调用的onSaveInstanceState()方法所保存的bundle作为参数同时传递给onRestoreIntanceState
和onCreate,但二者是有区别的.
俩者区别:
1) onRestoreIntanceState一旦被调用,其参数Bundle savedInstanceState是一定有值的,
所以不需要额外的判断是否为空。
2) onCreate()不行,onCreate如果是正常启动,其参数Bundle savedInstanceState为null,
所以必须进行额外的判断。官方建议采用onRestoreInstanceState()去恢复数据.
以下代码帮助理解:横竖屏切换下
public class MainActivity extends Activity {
private final static String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState != null) {
String test = savedInstanceState.getString("HelloWorld");
Log.d(TAG, "[onCreate] restore HelloWorld:" + test);
}
//用代码写死横竖屏
//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, "onSaveInstanceState");
outState.putString("HelloWorld", "test");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String test = savedInstanceState.getString("HelloWorld");
Log.d(TAG, "[onRestore] restore HelloWorld:" + test);
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
输出结果:
a.刚启动(Activity) : create-> start-> resume
b.旋转屏幕后,旧的activity先puase -->stop-->destory,而onSaveInstanceState就是在onStop之前调用.
c. 新的Activity的在oncreate方法中,if (savedInstanceState != null) 为true,从而打印log.从而说明旧activity在销毁前进行了数据的存储.
d.新的activity:create -> start -> onRestoreInstanceState -> onresume