Android中自定义View的状态保存

记得我在一次面试中遇到的一个问题是,关于自定义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是不会被调用的。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值