定義:
記憶一個對象的内部狀态,為了允許使用者取消不确定或者錯誤的操作,能夠恢複到以前的狀态。
優缺點:
優點:
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