Android保存Activity銷燬而丟失的數據

安卓中,活動存在四種狀態,分別是 運行狀態、暫停狀態、停止狀態和銷燬狀態,除了運行狀態之外,當系統內存不足的情況下,其他三種狀態都有可能被回收,這樣就會出現數據丟失的情況,那麼如何在活動被回收之前保存數據呢,今天介紹兩種方式(據說有四種,其他兩種不知道以後學了在更新)。

第一種:使用onSaveInstanceState()方法:

在任務棧中,B處於頂端,A處於B下面,如果A被回收了,那麼B返回後,依然會顯示A,只是此時的A是重新創建出來的活動,也就是說調用了A的onCreate方法創建出來的新的活動,因此,A之前的所有數據也就銷燬了,但是我們可以利用Activity提供的onSaveInstanceState方法:

   protected void onSaveInstanceState(Bundle outState) {
        outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState());
        Parcelable p = mFragments.saveAllState();
        if (p != null) {
            outState.putParcelable(FRAGMENTS_TAG, p);
        }
        getApplication().dispatchActivitySaveInstanceState(this, outState);
    }

在這個方法裏面,我們可以存儲那些我們想要保留的重要的臨時數據,吧他存放在Bundle對象裏面,如果這個活動倍銷燬了,那麼會自動調用這個方法對重要數據進行存儲,下次再重新開啓這個Activity的時候,會執行oncreate方法,我們就可以重onCreate方法的參數中接受這個存儲數據的Bundle對象,從裏面取出數據。這個

第二種:onRetainNonConfigurationInstance()方法

這個方法也會在活動倍銷燬錢調用,我是在做頭像上傳的時候遇到了這樣的一個問題:每次選擇好照片顯示在Activity中的時候,如果橫豎屏切換了,那麼會重新加載佈局,也就是說重新調用onCreate方法,之前的活動中的圖片當然也就沒有了(不要說什麼禁止橫豎屏切換什麼的,遇到問題先找解決辦法然後再想流程處理的問題,這樣纔會進步!哈哈)那麼問題來了,如何保存已經加載好的圖片呢,我使用的就是Activity提供的onRetainNonConfigurationInstance()方法,這個方法與getLastNonConfigurationInstance()(也是Activity提供的)是一起用的,我們可以重寫這個方法對圖片Uri進行保存:

public Object onRetainNonConfigurationInstance() {
return imageUri;
}

然後,在onCreate方法裏面通過getLastNonConfigurationInstance方法進行接收:

imageUri = (Uri)getLastNonConfigurationInstance();

接受到了之後,進行判斷,如果是null則不加載圖片,如果不是null,則直接加載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章