您的位置:首页 > 移动开发 > Android开发

Android中自定义View的状态保存

2016-06-28 16:02 597 查看
记得我在一次面试中遇到的一个问题是,关于自定义View中,View的保存状态问题。

做过自定义View的开发人员应该都遇到过这种问题,因为Activity转屏,或者是Home键到后台时都很容易在被系统销毁,恢复时我们肯定是希望看到View保留着之前的状态。

而Android中有一套标准的做法,我们可以从Android自带的控件里看到。比如说TextView的源代码( SavedState extends BaseSaveState):

/**

* User interface state that is stored by TextView for implementing

* {@link View#onSaveInstanceState}.

*/

public static class SavedState extends BaseSavedState {

int tart;

int end;

CharSequence text;

boolean frozenWithFocus;

CharSequence error;

SavedState(Parcelable superState) {
super(superState);
}

@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeInt(start);
out.writeInt(end);
out.writeInt(frozenWithFocus ? 1 : 0);
......
BaseSavedState是View的一个内部静态类,从代码上我们可以知道是吧控件的属性(如start)打包到Parcel容器,Activity的onSaveInstanceState、onRestoreInstanceState最后也会调用到控件的这2个同名方法。
下面是关于Activity状态的保存:
Activity的状态
(https://img-blog.csdn.net/20160628153028522)
注意:我们无法保证系统会在销毁Activity前一定调用onSaveInstanceState,例如用户的行为是在显示关闭Activity,比如说,在使用返回键退出Activity时,由于用户的行为是在显示关闭Activity,所以不会调用onSaveInstanceState.
那么,如果系统调用onSaveInstanceState,它是在onStop还是onPause之前执行呢?
答案是肯定在调用onStop之前,但是不是在onPause之前就不能确定了,需要看情况而定。
总结: Activty类的onSaveInstanceState默认实现会恢复Activity的状态。默认实现会为布局中的每一个View调用相应的onSaveInstanceSate方法,让每一个View都能保存自身的信息。
这里需要注意一个细节:想要保存View的状态,需要在XML布局文件中提供一个唯一的ID(android:id),如果没有设置这个ID的话,View控件的onSaveInstanceState是不会被调用的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: