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,则直接加载。

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