Android和设计模式:备忘录模式
16lz
2022-01-17
最近在继续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());
}
......
}
以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());
}
......
}
更多相关文章
- android切换输入法工具类
- Android中shape的使用
- Android隐藏状态栏 全屏
- Android(安卓)7 强势来袭开发者们不得不知道的细节
- 详解 Android(安卓)的 Activity 组件 -
- Android中Activity启动模式launchermode和intent.addFlags
- Android知识体系总结
- 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Fedora镜像
- 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像