Activity生命周期
1.启动Activity A:onCreate——onStart——onResume,运行状态
2.回到桌面或手机锁屏:onPause—onStop暂停运行
3.由第二步在返回Activity A:onRestart—onStart—onResume
4.Activity A跳转到Activity B:(A)onPause—B启动过程—(A)onStop,A停滞状态
5.从B再回到A:(B)onPause—(A)onRestart—(A)onStart—(A)onResume—(B)onPause——(B)onStop-onDestroy,A运行状态
6.当前Activity处于第2步和第4步,系统内存不足,杀死当前Activity,用户再退回此Activity:再次onCreate——onStart——onResume,运行状态
7.用户退出当前Activity:onPause——onStop——onDestory,结束Activity。
两个并不是生命周期的方法:onSaveInstanceState和onRestoreInstranceState方法
总结如下:
1、当应用遇到意外情况(如:内存不足)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。
2、当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。
通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
是之前意外销毁的Activity,再次返回到前台时,在onStart方法后会调用此方法来恢复之前onSaveInstanceState保存的bundle数据。
示例代码:
暂时存储
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// 保存用户当前游戏状态
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// 通常调用父类,让他能保存View的信息。
super.onSaveInstanceState(savedInstanceState);
}
获取并展示
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
// 检查是否是一个前面销毁的activity实例。
if (savedInstanceState != null) {
// 恢复玩家状态
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// 为新实例初始化一个默认值
}
...
}
或者
public void onRestoreInstanceState(Bundle savedInstanceState) {
// 调用父类恢复默认的View的状态
super.onRestoreInstanceState(savedInstanceState);
// 恢复玩家状态
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}