Activity异常情况下的数据保存

来源:互联网 发布:淘宝怎么更改店铺地址 编辑:程序博客网 时间:2024/05/16 07:09

onSaveInstanceState和onRestoreInstanceState方法前者是用来异常保存数据的,后者是用来恢复数据的,

 @Override    protected void onSaveInstanceState(Bundle outState) {        // TODO Auto-generated method stub        super.onSaveInstanceState(outState);        outState.putString("test", "test");    }    @Override    protected void onRestoreInstanceState(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onRestoreInstanceState(savedInstanceState);        String test = savedInstanceState.getString("test");        Log.e("test", test);    }

对于Activity被意外终止时,Activity会调用onSaveInstanceState去保存数据,然后Activity会委托Window去保存数据,window再委托它上面的顶级容器去保存数据,最后顶层容器通知各自的View保存数据,这个比较类似事件分发。

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);    }

查看Android源码我知道,每个View都有onSaveInstanceState和onRestoreInstanceState这两个方法,
如在TextView,我们可以看到保存的信息状态,可以看出,保存了自己的文本内容和文本的选中状态

 @Override    public Parcelable onSaveInstanceState() {        Parcelable superState = super.onSaveInstanceState();        // Save state if we are forced to        boolean save = mFreezesText;        int start = 0;        int end = 0;        if (mText != null) {            start = getSelectionStart();            end = getSelectionEnd();            if (start >= 0 || end >= 0) {                // Or save state if there is a selection                save = true;            }        }        if (save) {            SavedState ss = new SavedState(superState);            // XXX Should also save the current scroll position!            ss.selStart = start;            ss.selEnd = end;            if (mText instanceof Spanned) {                Spannable sp = new SpannableStringBuilder(mText);                if (mEditor != null) {                    removeMisspelledSpans(sp);                    sp.removeSpan(mEditor.mSuggestionRangeSpan);                }                ss.text = sp;            } else {                ss.text = mText.toString();            }            if (isFocused() && start >= 0 && end >= 0) {                ss.frozenWithFocus = true;            }            ss.error = getError();            return ss;        }        return superState;    }

最常见的是手机横竖屏切换导致activity异常终止,我们可以指定Activity的configChanges的属性为orientation在版本号大于13的时候需要添加另一个screenSize来保证Activity在切换的时候不被销毁。

0 0
原创粉丝点击