無心中留意到 onCreate(Bundle savedInstanceState) ,savedInstanceState到底是什麼,因而上網搜了搜
html
當某個activity變得「容易」被系統銷燬時,該activity的onSaveInstanceState就會被執行,除非該activity是被用戶主動銷燬的,例如當用戶按BACK鍵的時候。
注意上面的雙引號,何爲「容易」?言下之意就是該activity尚未被銷燬,而僅僅是一種可能性。這種可能性有哪些?經過重寫一個 activity的全部生命週期的onXXX方法,包括onSaveInstanceState和onRestoreInstanceState方法,我 們能夠清楚地知道當某個activity(假定爲activity A)顯示在當前task的最上層時,其onSaveInstanceState方法會在何時被執行,有這麼幾種狀況:
一、當用戶按下HOME鍵時。
這是顯而易見的,系統不知道你按下HOME後要運行多少其餘的程序,天然也不知道activity A是否會被銷燬,故系統會調用onSaveInstanceState,讓用戶有機會保存某些非永久性的數據。如下幾種狀況的分析都遵循該原則
二、長按HOME鍵,選擇運行其餘的程序時。
三、按下電源按鍵(關閉屏幕顯示)時。
四、從activity A中啓動一個新的activity時。
五、屏幕方向切換時,例如從豎屏切換到橫屏時。
在屏幕切換以前,系統會銷燬activity A,在屏幕切換以後系統又會自動地建立activity A,因此onSaveInstanceState必定會被執行。
總而言之,onSaveInstanceState的調用遵循一個重要原則,即當系統「未經你許可」時銷燬了你的activity,則onSaveInstanceState會被系統調用,這是系統的責任,由於它必需要提供一個機會讓你保存你的數據(固然你不保存那就隨便你了)。
至於onRestoreInstanceState方法,須要注意的是,onSaveInstanceState 方法和onRestoreInstanceState方法「不必定」是成對的被調用的,onRestoreInstanceState被調用的前提 是,activity A「確實」被系統銷燬了,而若是僅僅是停留在有這種可能性的狀況下,則該方法不會被調用,例如,當正在顯示activity A的時候,用戶按下HOME鍵回到主界面,而後用戶緊接着又返回到activity A,這種狀況下activity A通常不會由於內存的緣由被系統銷燬,故activity A的onRestoreInstanceState方法不會被執行。
另外,onRestoreInstanceState的bundle參數也會傳遞到onCreate方法中,你也能夠選擇在onCreate方法中作數據還原。java
轉載於: http://gundumw100.iteye.com/blog/1115080android
例子:ide
Activity裏的onSaveInstanceState()方法,雖然系統會自動調用它來保存Activity的一些數據,但當除它默認要保存的數據外,咱們還要保存一些其餘數據的時候, 咱們就須要覆蓋onSaveInstanceState()方法來保存Activity的附件信息。例如在播放視頻過程當中,橫豎屏切換要保持當前播放時間進度,在默認狀況下播放時間是不被自動保存的。svn
寫了一個簡單的播放視頻的例子,在橫豎屏切換時保持當前播放進度,效果圖:this
橫屏切換:google
mian.xml的代碼:spa
[html] view plaincopy.net
<?xml version="1.0" encoding="utf-8"?> code
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<VideoView android:id="@+id/myvideo" android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
MainAcrtivity主要代碼部分:
[java] view plaincopy
private VideoView videoView;
private static final String VIDEO_PATH = Environment
.getExternalStorageDirectory()
+ File.separator
+ "mymovie"
+ File.separator + "shenghuaweiji.mp4";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v("tag", "onCreate");
if (videoView == null) {
videoView = (VideoView) this.findViewById(R.id.myvideo);
MediaController controller = new MediaController(this);
videoView.setMediaController(controller);
videoView.setVideoPath(VIDEO_PATH);
videoView.requestFocus();
}
if (savedInstanceState != null
&& savedInstanceState.getInt("currentposition") != 0) {
videoView.seekTo(savedInstanceState.getInt("currentposition"));
}
videoView.start();
}
onCreate方法中的參數savedInstanceState就是保存的Activity一些狀態。
[java] view plaincopy
savedInstanceState.getInt("currentposition")
獲取視頻播放時間。
實現並覆蓋了onSaveInstanceState方法:
[java] view plaincopy
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
outState.putInt("currentposition", videoView.getCurrentPosition());
Log.v("tag", "onSaveInstanceState");
super.onSaveInstanceState(outState);
}
紅色代碼是將當前video的播放時間存儲在Bundle中。
這樣在橫豎屏切換時保證了播放狀態,源代碼:http://bigcateasymorse.googlecode.com/svn/trunk/save-activity-state1.0/