android onSaveInstanceState

  

   無心中留意到 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

image

橫屏切換:google

image

mian.xml的代碼:spa

[html] view plaincopy.net

  1. <?xml version="1.0" encoding="utf-8"?>  code

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

  3.     android:orientation="vertical" android:layout_width="fill_parent"  

  4.     android:layout_height="fill_parent">  

  5.      

  6.     <VideoView android:id="@+id/myvideo"   android:layout_width="wrap_content"  

  7.               android:layout_height="wrap_content" />  

  8. </LinearLayout>  

MainAcrtivity主要代碼部分:

[java] view plaincopy

  1. private VideoView videoView;  

  2. private static final String VIDEO_PATH = Environment  

  3.         .getExternalStorageDirectory()  

  4.         + File.separator  

  5.         + "mymovie"  

  6.         + File.separator + "shenghuaweiji.mp4";  

  7.   

  8. /** Called when the activity is first created. */  

  9. @Override  

  10. public void onCreate(Bundle savedInstanceState) {  

  11.     super.onCreate(savedInstanceState);  

  12.     setContentView(R.layout.main);  

  13.     Log.v("tag""onCreate");  

  14.      

  15.     if (videoView == null) {  

  16.         videoView = (VideoView) this.findViewById(R.id.myvideo);  

  17.         MediaController controller = new MediaController(this);  

  18.         videoView.setMediaController(controller);  

  19.         videoView.setVideoPath(VIDEO_PATH);  

  20.         videoView.requestFocus();  

  21.     }  

  22.   

  23.     if (savedInstanceState != null  

  24.             && savedInstanceState.getInt("currentposition") != 0) {  

  25.   

  26.         videoView.seekTo(savedInstanceState.getInt("currentposition"));  

  27.     }  

  28.     videoView.start();  

  29.   

  30. }  

onCreate方法中的參數savedInstanceState就是保存的Activity一些狀態。

[java] view plaincopy

  1. savedInstanceState.getInt("currentposition")  

獲取視頻播放時間。

實現並覆蓋了onSaveInstanceState方法:

[java] view plaincopy

  1. @Override  

  2. protected void onSaveInstanceState(Bundle outState) {  

  3.     // TODO Auto-generated method stub  

  4.     outState.putInt("currentposition", videoView.getCurrentPosition());  

  5.     Log.v("tag""onSaveInstanceState");  

  6.     super.onSaveInstanceState(outState);  

  7. }   

紅色代碼是將當前video的播放時間存儲在Bundle中。

這樣在橫豎屏切換時保證了播放狀態,源代碼:http://bigcateasymorse.googlecode.com/svn/trunk/save-activity-state1.0/

相關文章
相關標籤/搜索