1. 程式人生 > >Activity,Fragment狀態儲存

Activity,Fragment狀態儲存

Activity

android:alwaysRetainTaskState


用法<activity android:alwaysRetainTaskState="true/false"></activity>
     用來標記Activity所在的Task的狀態是否總是由系統來保持——“true”,表示總是;“false”,表示在某種情形下允許系統恢復Task 到它的初始化狀態。預設值是“false”。這個特性只針對Task的根Activity有意義;對其它Activity來說,忽略之。
     一般來說,特定的情形如當用戶從主畫面重新選擇這個Task時,系統會對這個Task進行清理(從stack中刪除位於根Activity之上的所有Activivity)。典型的情況,當用戶有一段時間沒有訪問這個Task時也會這麼做,例如30分鐘。

     然而,當這個特性設為“true”時,使用者總是能回到這個Task的最新狀態,無論他們是如何啟動的。這非常有用,例如,像Browser應用程式,這裡有很多的狀態(例如多個開啟的Tab),使用者不想丟失這些狀態。

Fragment

setRetainInstance()

為什麼會在這兒花一定的篇幅詳細說明setRetainInstance()方法呢?因為此方法可以有效地提高系統的執行效率,對流暢性要求較高的應用可以適當採用此方法進行設定。

 Fragment有一個非常強大的功能——就是可以在Activity重新建立時可以不完全銷燬Fragment,以便Fragment可以恢復。在onCreate()方法中呼叫setRetainInstance(true/false)方法是最佳位置。當Fragment恢復時的生命週期如圖1-6所示,注意圖中的紅色箭頭。當在onCreate()方法中呼叫了setRetainInstance(true)後,Fragment恢復時會跳過onCreate()和onDestroy()方法,因此不能在onCreate()中放置一些初始化邏輯,切忌!

activity在什麼情況下被銷燬?

     使用者按回退鍵
     呼叫finish
     放在回退棧中太久
     橫豎屏切換

前面兩種情況下

     系統會認為使用者不再需要這個activity了,所以在銷燬時不會做任何事
     沒有任何瀏覽方法能倒回去,只能再次啟動該app

在第三、四種情況下

     使用者可以通過回退鍵或其他方式瀏覽回去
     系統會用bundle儲存activity的佈局狀態包括view狀態
     然後銷燬activity,並在重建activity時恢復以前的狀態,無需程式設計
     但是注意,系統銷燬前不一定能儲存所有使用者希望儲存的資料

     系統提供onSaveInstanceState()方法給使用者儲存額外的資料
     提供onRestoreInstanceState()方法用於重建時恢復
     但是上述方法僅僅儲存少量鍵值對資料,無法保留大量資料

     系統提供onRetainNonConfigurationInstance()用於保留大量的資料
     提供getLastNonConfigurationInstance()使用者恢復資料
     注意這個方法不能傳遞和context有關的東西,比如view、adapter等等,否則會洩露記憶體
     只能儲存自定義的MyDataObject
     注意這個方法已經 deprecated in API level 13. 官網推薦了下述fragment的方法


activity上面有fragment的情況

     官方大力推薦使用fragment來實現模組化,如果activity上面有fragment
     那麼有一個在銷燬重建activity時透傳fragment狀態的方法 setRetainInstance()
     方法解釋在 http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)
     簡單實踐了一下,似乎存在一些問題,可能和activity與fragment的連線和分工有關
     似乎從fragment到activity方向的連線或指標正常
     但是從activity到fragment的連線或指標卻不對了,activity無法更新fragment
     在我的專案的實踐結果是
          fragment上面的資料,比如listview,原本和下面的activity裡面的list是對應的,但是透傳之後不對應了

防止activity被銷燬重建

     橫豎屏切換時
          橫豎屏切換時導致activity銷燬和重建
          這個動作的目的是擔心activity的佈局及資源不適合橫豎屏切換
          通過銷燬重建給程式一個機會來適配
          但實際上,如果佈局和資源沒有和橫豎屏繫結的話
          其實沒必要做這個銷燬,完全可以取消這個相當危險的操作
          取消方法是在activity的屬性中新增 android:configChanges="orientation|screenSize"

     放在回退棧中太久
          android:alwaysRetainTaskState="true" ----- 始終維持activity的狀態
          似乎這個屬性可用,但我不很肯定
          注意文件說明這個方法只對任務棧中第一個activity有效