EditText输入的文本为何能在Activity销毁时留存?屏幕旋转后文本未丢失原理
屏幕旋转时EditText内容自动保留的实现原理
这个能力是Android Framework 自带的View状态自动保存/恢复机制实现的,核心流程如下:
- 第一步:配置变更触发状态保存
当屏幕旋转这类配置变更事件发生时,系统在销毁旧Activity前,会先调用Activity.onSaveInstanceState(Bundle outState)回调。如果调用了父类的该方法(默认实现就会调用),系统会自动遍历当前整个视图树,收集所有带唯一android:id属性的View的状态。 - 第二步:EditText自身实现状态序列化
EditText的父类TextView已经默认重写了View.onSaveInstanceState()方法,会把当前输入的文本内容、光标位置、选中区域、是否可编辑等状态打包成Parcelable类型的序列化对象。系统会以该EditText的id作为key,把这个状态对象存入传入的Bundle实例中。 - 第三步:Activity重建后自动恢复状态
新Activity创建完成后,系统会把之前存储的Bundle实例传入onCreate(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceState)方法。同样会遍历新创建的视图树,根据每个View的id从Bundle中取出对应的状态数据,调用View.onRestoreInstanceState(Parcelable state)方法把状态回写给View,EditText的内容就会恢复到旋转前的状态。
注意两个会导致该机制失效的常见场景:
- EditText没有设置
android:id属性:系统无法通过id匹配新旧View,无法完成状态存取- 重写
Activity.onSaveInstanceState()时没有调用super.onSaveInstanceState(outState):会跳过系统默认的View状态收集逻辑
内容的提问来源于stack exchange,提问作者Greenlight
相关产品推荐
相关产品推荐

