有时候,在我们使用Application的时候可能会遇到因横竖屏切换,或者系统回收内存等意外状况而销毁掉Activity,而再次创建,这时我们会发现,之前Activity的状态没有被保存下来,遇到这种情况应该怎么处理囊?
答案我们在Android的API文档中找到了,抓去重要的一段:在遇到意外情况销毁掉Activity之前,系统会执行一个onSaveInstanceState()方法,调用时系统会传入一个Bundle对象, 你可以利用 putString() 之类的方法,以键值对的方式来把activity状态信息保存到该Bundle对象中。 然后,如果系统杀掉了你的application进程并且用户又返回到你的activity,系统就会重建activity并将这个 Bundle 传入onCreate() 和onRestoreInstanceState() 中,你就可以从 Bundle 中解析出已保存信息并恢复activity状态。如果没有储存状态信息,那么传入的 Bundle 将为null,与Activity第一次创建相同。
PS:activity被销毁之前,并不是每次都会调用 onSaveInstanceState() ,因为存在不必保存状态的情况(如用户按BACK键关闭掉了activity)。 如果系统要调用 onSaveInstanceState() 方法,那么它通常会在 onStop() 方法之前并且可能是在 onPause() 之前调用。
点击查看API→http://wear.techbrood.com/guide/components/activities.html
我们来创建一个Demo测试一下。
首先创建项目,在MainActivity中这样写:
package com.daxiangzai.androiddemo.savingactivitystate;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.view.View;
public class MainActivity extends ActionBarActivity {
private String TAG = "TAG";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//若savedInstanceState不为空,获取值并输入日志
if(savedInstanceState!=null){
Log.i(TAG, savedInstanceState.getString("onCreate"));
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//若savedInstanceState不为空,获取值并输入日志
if(savedInstanceState!=null){
Log.i(TAG, savedInstanceState.getString("onRestoreInstanceState"));
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState");
//存储值到Bundle对象中
outState.putString("onCreate", "Restore the activity state in onCreate method");
outState.putString("onRestoreInstanceState", "Restore the activity state in onRestoreInstanceState method");
}
@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause");
}
}
注意:这里还有另外一个方法(重载的方法):
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
方法名一样,但参数不同。不要将两个方法混淆哦!
之后我们运行程序,进行一个横竖屏切换动作,我们会发现Logcat会出现下列信息:
由此可见,此实例的onSaveInstanceState()方法onPause()方法之后进行的(不是一定都在onPause()方法之后执行),在Activity被重新创建的时候,onCreate()方法与onRestoreInstanceState()方法均能获得Bundle对象。