1. 程式人生 > >Android 元件之Fragment旋轉屏幕後的資料保留問題小述

Android 元件之Fragment旋轉屏幕後的資料保留問題小述

一、概述

我們知道,當我們旋轉螢幕或者裝置配置發生變化的時候,Fragment和Activity都會被銷燬並被重建,在這個過程中就會使之前的資料丟失或成員變數被初始化從而產生問題,所以接下來我們就簡單分析下解決方法。

二、正文

解決這個問題我們首先想到的當然是onSaveInstanceState(Bundle bundle)方法

        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState)
; outState.putString("TAG_COUNT", "儲存的內容"); } // 當前在Fragment中 @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if(savedInstanceState != null){ (String)
savedInstanceState.get("TAG_COUNT"); } }

雖然onSaveInstanceState(…)方法很方便,但卻也有力有不逮的時候,例如在旋轉螢幕前我們想要儲存Fragment內所有的物件呢,甚至這個Fragment異常複雜呢,那麼像我們之前的通過Bundle儲存就有點不現實了,好在系統給fragment提供了retainInstance的屬性值,預設值為false,呼叫setRetainInstance(true)方法可保留fragment,而已保留的fragment不會隨著activity一起銷燬,相反,它會被一直保留並在需要的時候原封不動的傳遞給新的activity。

正常情況下,當裝置發生旋轉時,FragmentManager會立即銷燬該fragment例項,隨後旋轉完成後,新的activity的新的FragmentManager會立即新建一個新的Fragment及其檢視,而當我們設定了retainInstance屬性true時,當裝置發生旋轉時,該fragment關聯的檢視會被銷燬,但是fragment本身不會被銷燬,當重建的時候,新的FragmentManager會找到這個被保留的fragment,並重新建立它的檢視。

        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            // 很簡單就一句話,測試時可以列印一個物件地址
            // 你會發現旋轉成功後其地址沒有改變,說明它還是原來的物件,親測
            setRetainInstance(true);
        }

既然retainInstance屬性這麼方便,那麼我們為什麼有時還要使用onSaveInstanceState(…)方法呢,哈哈其實兩者還是有區別的,主要區別在於資料儲存的時間長短,如果使用retainInstance,只有當activity因裝置發生改變被銷燬時,fragment才會短時間處於被保留狀態,如果activity是因系統需要回收記憶體而被銷燬,那麼所有被保留的fragment也會被隨之銷燬;如需持久地儲存資料,那麼就得使用onSaveInstanceState(…)方法了,例如使用者暫時離開應用後,系統因回收記憶體需要銷燬activity,那麼保留的fragment也會隨之銷燬。

三、總結

本節主要簡單的介紹了Fragment資料保留問題,如果想要檢視更多Fragment的基礎知識,去我的部落格目錄裡檢視吧,因為關於每塊知識點的介紹,部落格單節寫的比較零散,不容易查詢。