Activity生命周期要点

- 重写生命周期方法必须调用super方法
- onSaveInstanceState会在onPause和onStop间调用,onRestoreInstanceState会在onStart和onResume间调用. 如果Activity实例没有销毁,onRestoreInstanceState是不会调用的.
- onCreate和onRestoreInstance都带有Bundle参数,这两者有何区别? 其实两者都可以做状态恢复,但有一点要注意:子View(比如在layout xml文件中定义的带id的EditText)会在onRestoreInstance中做状态恢复,也就是说在onCreate/onStart时,子View其实还没有恢复状态的。
实验代码:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity.TEST";
private int saveState = 0;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.v(TAG, "In onCreate...");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
Log.v(TAG, "saveInstanceState is null");
} else {
saveState = savedInstanceState.getInt("saveState", 0);
Log.v(TAG, String.format("onCreate saveInstanceState is not null.saveState:%d", saveState));
}
editText = (EditText) findViewById(R.id.editText);
Log.v(TAG, "onCreate editText value:" + editText.getText());
}
@Override
protected void onStart() {
Log.v(TAG, "In onStart...");
super.onStart();
Log.v(TAG, "onStart editText value:" + editText.getText());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
Log.v(TAG, "In onRestoreInstanceState...");
super.onRestoreInstanceState(savedInstanceState);
Log.v(TAG, String.format("restore saveInstanceState is not null.saveState:%d", saveState));
Log.v(TAG, "onRestoreInstanceState editText value:" + editText.getText());
}
@Override
protected void onResume() {
Log.v(TAG, "In onResume...");
super.onResume();
}
@Override
protected void onPause() {
Log.v(TAG, "In onPause...");
super.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
Log.v(TAG, "In onSaveInstanceState...");
super.onSaveInstanceState(outState);
outState.putInt("saveState", 1);
}
@Override
protected void onStop() {
Log.v(TAG, "In onStop...");
super.onStop();
}
@Override
protected void onRestart() {
Log.v(TAG, "In onRestart...");
super.onRestart();
}
@Override
protected void onDestroy() {
Log.v(TAG, "In onDestroy...");
super.onDestroy();
}
}
应用启动

MainActivity.TEST: In onCreate...
MainActivity.TEST: saveInstanceState is null
MainActivity.TEST: onCreate editText value:Hello World!
MainActivity.TEST: In onStart...
MainActivity.TEST: onStart editText value:Hello World!
MainActivity.TEST: In onResume...
Note:
(1) 首次启动时onCreate的savedInstanceState参数为null;
(2) 首次启动时onRestoreInstanceState并没有调用
切换应用/切换Activity/熄屏/亮屏
MainActivity.TEST: In onPause...
MainActivity.TEST: In onSaveInstanceState...
MainActivity.TEST: In onStop...
...
MainActivity.TEST: In onRestart...
MainActivity.TEST: In onStart...
MainActivity.TEST: onStart editText value:Hello World!
MainActivity.TEST: In onResume...
Note:
(1) 这组场景并没有销毁Activity,所以只是在onStart <-> onStop 的可见周期内状态切换
(2) 调用了onSaveInstanceState, 没有调用onRestoreInstanceState
旋转屏幕
MainActivity.TEST: In onPause...
MainActivity.TEST: In onSaveInstanceState...
MainActivity.TEST: In onStop...
MainActivity.TEST: In onDestroy...
MainActivity.TEST: In onCreate...
MainActivity.TEST: onCreate saveInstanceState is not null.saveState:1
MainActivity.TEST: onCreate editText value:Hello World!
MainActivity.TEST: In onStart...
MainActivity.TEST: onStart editText value:Hello World!
MainActivity.TEST: In onRestoreInstanceState...
MainActivity.TEST: restore saveInstanceState is not null.saveState:1
MainActivity.TEST: onRestoreInstanceState editText value:Hello World!
MainActivity.TEST: In onResume...
在EditText输入HelloWord2!, 重做实验:
MainActivity.TEST: In onPause...
MainActivity.TEST: In onSaveInstanceState...
MainActivity.TEST: In onStop...
MainActivity.TEST: In onDestroy...
MainActivity.TEST: In onCreate...
MainActivity.TEST: onCreate saveInstanceState is not null.saveState:1
MainActivity.TEST: onCreate editText value:Hello World!
MainActivity.TEST: In onStart...
MainActivity.TEST: onStart editText value:Hello World!
MainActivity.TEST: restore saveInstanceState is not null.saveState:1
MainActivity.TEST: onRestoreInstanceState editText value:Hello World2!
MainActivity.TEST: In onResume...
Note:
(1) 旋转屏幕时,Activity先销毁后重建, 此时onSaveInstanceState和onRestoreInstanceState被调用,onCreate的saveInstanceState 非null
(2) 当在editText输入"Hello Word2!"后再做旋转操作,发现直到onRestoreInstanceState时才得到改变的值,即在onCreate/onStart中editText还没恢复状态
后退键/Kill
MainActivity.TEST: In onPause...
MainActivity.TEST: In onStop...
MainActivity.TEST: In onDestroy...
Note:
Activity都要销毁了,当然没有调用onSaveInstanceState