I have 2 classes ParentClass and ChildClass :
ParentClass is a subclass of RelativeLayout that saves state using onSaveInstanceState () / onRestoreInstanceState () with the following code:
@Override protected Parcelable onSaveInstanceState() { SavedState savedState = new SavedState(super.onSaveInstanceState()); savedState.someObj = someObj; savedState.someInt = someInt; savedState.someEnum = someEnum; return savedState; } @Override protected void onRestoreInstanceState(Parcelable in) { if (!(in instanceof SavedState)) { super.onRestoreInstanceState(in); return; } SavedState savedState = (SavedState) in; super.onRestoreInstanceState(savedState.getSuperState()); this.someObj = savedState.someObj; this.someInt = savedState.someInt; this.someEnum = savedState.someEnum; }
And here is the SavedState code:
public static class SavedState extends BaseSavedState { private SomeObj someObj; private int someInt; private SomeEnum someEnum; public SavedState(Parcelable superState) { super(superState); } public SavedState(Parcel source) { super(source); someInt = source.readInt(); someEnum = SomeEnum.values()[source.readInt()]; someObj = source.readParcelable(SomeObj.class.getClassLoader()); } @Override public void writeToParcel(@NonNull Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeInt(someInt); dest.writeInt(someEnum.ordinal()); dest.writeParcelable(someObj, flags); } public static final Creator<SavedState> CREATOR = new Creator<SavedState>() { public SavedState createFromParcel(Parcel in) { return new SavedState(in); } public SavedState[] newArray(int size) { return new SavedState[size]; } }; }
Nothing unusual, everything works as expected (saving / restoring state) when I use this view directly.
Then I have a ChildClass that extends the ParentClass It also saves its state using exactly the same code, except that I only save long and int fields.
When an application tries to restore the ChildClass view ChildClass by calling its SavedState constructor with Parcel from CREATOR , it will work with the following stack:
Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.company.app.ParentClass$SavedState 1 android.os.Parcel.readParcelableCreator Parcel.java, line 2320 2 android.os.Parcel.readParcelable Parcel.java, line 2270 3 android.view.AbsSavedState.<init> AbsSavedState.java, line 57 4 android.view.View$BaseSavedState.<init> View.java, line 20128 5 com.company.app.ChildClass$SavedState.<init> ChildClass.java, line 151 6 com.company.app.ChildClass$SavedState$1.a ChildClass.java, line 166 7 com.company.app.ChildClass$SavedState$1.createFromParcel ChildClass.java, line 164
source share