Android面试集锦系列(30)——自己设置View的状态是如何保存的?

作者 : 开心源码 本文共1981个字,预计阅读时间需要5分钟 发布时间: 2022-05-12 共204人阅读

2009年冬天,北京寒风刺骨,我们公司组织到北京进行为期一周的Android开发培训,讲师来自荷兰的Hello9培训机构。让我印向深刻的是,说着极易让人打瞌睡的北欧英文的讲师,在给我们讲EditText控件时,说到在Activity转屏时EditText是不会保存状态的(即在EditText中输入字符,而后转屏,重建Activity后EditText之前输入的字符没有被保存)。为表示他的正确,他特意演示了一下,这一演示发现状态被保存了!后来他解释说是,在早期的SDK版本(1.6以前)的确是不会保存的,之后Android做了改进。

在我问面试者关于自己设置View的问题时,常常会问他们关于保存View的状态的问题,假如对方不大清楚怎样做,我会认为面试者在自己定View上的经验不够,由于至少要知道可以在View的onSaveInstanceState中保存数据吧。

面试题:自己设置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之前就不能确认了,要看情况,官方文档在说明这个执行顺序时用了“可能”这个词。

小结

Activity类的onSaveInstanceState默认实现会恢复Activity的状态,默认实现会为布局中的每个View调用相应的 onSaveInstanceState方法,让每个View都能保存自身的信息。

这里需要注意一个细节:想要保存View的状态,需要在XML布局文件中提供一个唯一的ID(android:id),假如没有设置这个ID的话,View控件的onSaveInstanceState是不会被调用的。

最后

在现在这个金三银四的面试季,我自己在网上也搜集了很多资料做成了文档和架构视频资料免费分享给大家【包括高级UI、性能优化、架构师课程、NDK、Kotlin、混合式开发(ReactNative+Weex)、Flutter等架构技术资料】,希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

资料获取方式:加入Android架构交流QQ群聊:513088520 ,进群即领取资料!!!

点击链接加入群聊【Android移动架构总群】:加入群聊

资料大全

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Android面试集锦系列(30)——自己设置View的状态是如何保存的?

发表回复