Android -- 每日一问:自定义 View 的状态是如何保存的?

Posted Kevin-Dev

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android -- 每日一问:自定义 View 的状态是如何保存的?相关的知识,希望对你有一定的参考价值。

典型回答

android有一套标准的做法,做过自定义View的人很容易遇到这个问题,因为Activity转屏,或Home键到后台很容易在被系统销毁,恢复时我们肯定是希望看到View保持之前状态。

提示:系统内存紧张时会主动销毁这类Activity,做为开发我们可以利用DDMS的stop process模拟这一动作而不必等到内存紧张时,如下图所示:

这个标准的做法可以随便从一个Android自带的控件中看到,如TextView的源代码(SavedState extends BaseSavedState)。

    /**
     * User interface state that is stored by TextView for implementing
     * @link View#onSaveInstanceState.
     */
    public static class SavedState extends BaseSavedState 
        int selStart;
        int selEnd;
        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(selStart);
            out.writeInt(selEnd);
            out.writeInt(frozenWithFocus ? 1 : 0);
        ......

BaseSavedState是View的一个内部静态类,从代码上我们也很容易看出是把控件的属性(如selStart)打包到Parcel容器,Activity的onSaveInstanceState、onRestoreInstanceState最终也会调用到控件的这两个同名方法。

Parcel相关的问题以后专门再讲,现在我们可以焦点先放在状态保存上,先看一下Activity的状态如何保存的:

:无法保证系统会在销毁Activity前一定调用onSaveInstanceState,例如用户使用“返回” 按退出 Activity 时,因为用户的行为是在显式关闭 Activity,所以不会调用onSaveInstanceState。

如果系统调用onSaveInstanceState,那么它是在onStop还是在onPause之前执行呢?

可以肯定的是它会在调用 onStop之前,但是是不是在onPuase之前就不能确认了,要看情况,官方文档在说明这个执行顺序时用了“可能”这个词。

你的朋友是不是也在准备面试呢?你可以“请朋友读”,把今天的题目分享给好友,或许你能帮到他。

以上是关于Android -- 每日一问:自定义 View 的状态是如何保存的?的主要内容,如果未能解决你的问题,请参考以下文章

Android -- 每日一问:自定义 View 的状态是如何保存的?

每日一问:简述 View 的绘制流程

Android -- 每日一问:自定义一个类让其实现 Parcelable,大致流程是什么?

Android -- 每日一问:两个 Activity 之间如何传递参数?

Android -- 每日一问:谈谈MVCMVP和MVVM模式,你有在自己的项目中使用过吗?

每日一问-什么是Mysql数据库的UDF提权?