前言
在上一篇文章Android状态保存与恢复流程 完全解析,笔者详细地介绍了Activity、Fragment、View等的状态保存与恢复流程,相信大家对状态的保存与恢复都有了一定熟悉。而这篇文章就着重介绍自定义View该怎样保存与恢复状态,因为每个自定义View都是不同的情况,所以我们一般需要重写View的onSaveInstanceState()或onRestoreInstanceState()方法来实现我们需要的逻辑。那么本文的核心就是讨论怎样重写上面两个方法来保存或恢复我们需要的数据。
自定义View的状态保存
我们知道,当Activity调用了onSaveInstanceState方法后,便会对它的View Tree进行保存,而进一步对每一个子View调用其onSaveInstanceState()方法来保存状态。我们在不知道该怎样下手的时候,可以参考一下Android源码,因为它有很多Widget是继承自View的,也就是Android系统自身的“自定义View”,我们可以看看它们的onSaveInstanceState()方法是怎样写的,说不定可以启发我们的思路。这里笔者选取一个比较简单的控件:CheckBox,它的功能不用笔者多说了。它继承自CompoundButton,直接看CompoundButton#onSaveInstanceState:
@Override
public Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.checked = isChecked();
return ss;
}
onSaveInstanceState()方法返回Parcelable对象,也即是序列化对象,是Android提供的一种序列化方式,如果不了解序列化的读者可以看这篇文章Android IPC机制(一):序列化与反序列化,这里就不展开细说了。我们回到上面的源码,首先调用了super.onSaveInstanceState()方法来获取一个Parcelable对象,接着把superState传递进SavedState的构造方法,构建了一个SavedState,并且设置SavedState的checked属性为当前isChecked()方法的返回值,也即把状态保存在SavedState里面,并且返回SavedState。所以说SavedState是一个实现了Parcelable接口的类,我们来看看:
static class SavedState extends BaseSavedState {
boolean checked;
/**
* Constructor called from {@link CompoundButton#onSaveInstanceState()}
*/
Sav