日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

重新创建Activity

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 重新创建Activity 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

Activity的重新創建

  關于Activity生命周期的討論見本博客上次有關的博文:  

????? http://www.cnblogs.com/mengdd/archive/2012/12/01/2797784.html

  本篇博文要講的是activity重建的情況,以及這個過程中的數據存儲和恢復。

?

Activity的銷毀和重建

  Activity的銷毀分為兩種:

  第一種是正常的銷毀,比如用戶按下Back按鈕或者是activity自己調用了finish()方法;

  另一種是由于activity處于stopped狀態,并且它長期未被使用,或者前臺的activity需要更多的資源,這些情況下系統就會關閉后臺的進程,以恢復一些內存。

  需要注意的是這其中有一種情況就是屏幕旋轉的問題,當用戶旋轉手機屏幕,每一次都會導致activity的銷毀和重新建立。

  在第二種情況下,盡管實際的activity實例已經被銷毀,但是系統仍然記得它的存在,當用戶返回到它的時候,系統會創建出一個新的實例來代替它,這里需要利用舊實例被銷毀時候存下來的數據。這些數據被稱為“instance state”,是一個存在Bundle對象中的鍵值對集合。

  缺省狀態下,系統會把每一個View對象保存起來(比如EditText對象中的文本,ListView中的滾動條位置等),即如果activity實例被銷毀和重建,那么不需要你編碼,layout狀態會恢復到前次狀態。

  但是如果你的activity需要恢復更多的信息,比如成員變量信息,則需要自己動手寫了。

  如果要存儲額外的數據,必須覆寫回調函數onSaveInstanceState().

  系統會在用戶離開activity的時候調用這個函數,并且傳遞給它一個Bundle object,如果系統稍后需要重建這個activity實例,它會傳遞同一個Bundle object到onRestoreInstanceState()onCreate() 方法中去。

? ? ? ? ? ? ? ? ? ? ? ? ?

?  當系統停止activity時,它會調用onSaveInstanceState()過程1),如果activity被銷毀了,但是需要創建同樣的實例,系統會把過程1中的狀態數據傳給onCreate()onRestoreInstanceState()圖中標出的2和3)。

?

存儲Activity狀態

  當系統停止activity時,系統會調用onSaveInstanceState(),狀態信息會以鍵值對的形式存儲下來。

  默認的實現中存儲了activity的view系列的狀態,比如文本和滾動條位置等。

  要存儲額外的信息,必須自己實現onSaveInstanceState(),并且給Bundle object加上鍵值對。

  比如:

?

Save Activity State static final String STATE_SCORE = "playerScore"; static final String STATE_LEVEL = "playerLevel"; ...@Override public void onSaveInstanceState(Bundle savedInstanceState) {// Save the user's current game state savedInstanceState.putInt(STATE_SCORE, mCurrentScore);savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);// Always call the superclass so it can save the view hierarchy statesuper.onSaveInstanceState(savedInstanceState); }

  要記得調用基類的實現,以實現默認的實現。

?

恢復Activity狀態

  當activity重建時,需要根據Bundle中的狀態信息數據恢復activity。

  onCreate() 和onRestoreInstanceState()回調函數都會接收到這個Bundle

  因為每次創建新的activity實例的或重建一個實例的時候都會調用onCreate()方法,所以必須先檢查是否Bundle是null,如果是null,則表明是要創建一個全新的對象,而不是重建一個上次被銷毀的對象。

  比如onCreate()方法可以這么寫:

?

onCreate() 方法 @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); // Always call the superclass first// Check whether we're recreating a previously destroyed instanceif (savedInstanceState != null) {// Restore value of members from saved statemCurrentScore = savedInstanceState.getInt(STATE_SCORE);mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);} else {// Probably initialize members with default values for a new instance }... }

?

  除了在onCreate()中恢復狀態外,也可以選擇在onRestoreInstanceState()中實現,這個函數在onStart()之后調用。

  只有在有數據要恢復的時候系統會調用onRestoreInstanceState(),所以不必檢查Bundle是否為null。

?

onRestoreInstanceState()方法 public void onRestoreInstanceState(Bundle savedInstanceState) {// Always call the superclass so it can restore the view hierarchysuper.onRestoreInstanceState(savedInstanceState);// Restore state members from saved instancemCurrentScore = savedInstanceState.getInt(STATE_SCORE);mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); }

  此處也要注意,不要忘記調用基類實現。

?

參考資料:

  http://developer.android.com/training/basics/activity-lifecycle/recreating.html#SaveState

?

?

總結

以上是生活随笔為你收集整理的重新创建Activity的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。