定义:
记忆一个对象的内部状态,为了允许用户取消不确定或者错误的操作,能够恢复到以前的状态。
优缺点:
优点:
1,提供可恢复机制,能够让用户恢复到历史某个状态。
2,封装细节的操作。
缺点:
貌似犯了设计模式的通病,就是类的数量增加,消耗系统资源和性能。
在android源码中的使用:
activity源码查看:
http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/app/Activity.java#Activity.onSaveInstanceState%28android.os.Bundle%29
activity状态保存:onsaveInstanceState()和onRestoreInstanceState().
onSaveInstanceState()里面:
1,存储窗口的视图树状态。
2,存储fragment的状态。
3,调用activity的activityLifecycleCallbacks的onSaveInstance函数进行状态存储。
如下是2.3的activity里面onSaveInstanceState里面的方法,保存存储窗口的视图状态。
mContentParent.saveHierarchyState(states):
会去调用 dispatchSaveInstanceState(container)方法:看这个方法里面实现:
如无id,不保存状态,否则将状态存储在container里面。
存储信息的bundle存储在哪里?
onsaveInstanceState是在activity销毁之前,onstop之前进行的。
ActivityThread的performStopActivity里面通过调用callCallActivityonSaveInstanceState()来执行onsaveInstance
performStopActivityInner(r, null, false, saveState):
callCallActivityOnSaveInstanceState:
上面是保存状态,那么恢复状态呢?
当activity重新启动的时候,会去查询activityClientRecord,如果存在状态信息,就会调用onRestoreInstanceState()
代码可点击查看:http://grepcode.com/file_/repo1.maven.org/maven2/org.robolectric/android-all/5.0.0_r2-robolectric-1/android/app/ActivityThread.java/?v=source
Activity负责存储,恢复UI状态,也就是说负责存储备忘录,不对备忘录信息进行任何操作,只是传递给其他对象;
activity,View,ViewGroup存储对象的状态,创建备忘录,可以记录,恢复备忘录状态;
Bundle存储activity,View,ViewGroup的UI状态,存储备忘录状态。
2015年12月27日23:08:44更新
写个java的例子出来,主要涉及到状态的保存和恢复,使用备忘录模式实现:
首先原始类,要备份的对象类:
备忘录类,比起上面的类,少了创建备份和设置备份数据的方法:
Caretaker类:负责存储备忘录,不对内容进行操作和访问,将备忘录传递给其他对象。
测试类Test.java:
运算结果:
其他博客看到的一篇文章,讲的有意思,可以去看看:http://www.blogjava.net/amigoxie/archive/2007/04/12/110031.html