最近在繼續iPhone業務的同時還須要從新拾起Android。在有些生疏的狀況下,決定從Android源碼中感悟一些Android的風格和方式。在學習源碼的過程當中也發現了一些通用的模式,但願經過一個系列的文章總結和分享下。
該模式在不破壞封裝的狀況下,捕捉一個對象的內部狀態,這樣就能夠在以後恢復到該狀態。對於Android來講,在橫豎屏切換的時候就可能須要在切換前捕捉狀態,這樣在切換後就能夠進行恢復。
以TimePicker爲例,備忘錄模式實現的類圖以下:
其中,SavedState支持小時和分鐘數的存儲,這樣就能夠確保在一些關鍵節點先後保持狀態一直。
主要代碼以下:
public class TimePicker extends FrameLayout {
......
/**
* Used to save / restore state of time picker
*/
private static class SavedState extends BaseSavedState {
private final int mHour;
private final int mMinute;
private SavedState(Parcelable superState, int hour, int minute) {
super(superState);
mHour = hour;
mMinute = minute;
}
private SavedState(Parcel in) {
super(in);
mHour = in.readInt();
mMinute = in.readInt();
}
public int getHour() {
return mHour;
}
public int getMinute() {
return mMinute;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(mHour);
dest.writeInt(mMinute);
}
public static final Parcelable.Creator<SavedState> CREATOR
= new Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
@Override
protected Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
return new SavedState(superState, mCurrentHour, mCurrentMinute);
}
@Override protected void onRestoreInstanceState(Parcelable state) { SavedState ss = (SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); setCurrentHour(ss.getHour()); setCurrentMinute(ss.getMinute()); } ...... }