備忘錄模式是一種行為模式,該模式用于保存對象當前的狀態(tài),并且在之后可以再次恢復到此狀態(tài),要注意要保證被保存的對象狀態(tài)不能被對象從外部訪問。
使用場景:
1.要保存一個對象在某一個時刻的狀態(tài)或者部分狀態(tài)
2.如果用一個接口來讓其他對象得到這些狀態(tài),將會暴露對象的實現(xiàn)細節(jié)并破壞對象的封裝性,一個對象補西王外界直接訪問其內部狀態(tài),通過中間對象可以間接訪問其內部狀態(tài)。
類圖:
Originator是需要保存狀態(tài)的對象類,里面可以創(chuàng)建和恢復自身狀態(tài)。
Memento是備忘錄角色,用來存儲Originator的內部狀態(tài)
Caretaker 負責存儲備忘錄,不能對備忘錄的內容進行操作和訪問,只是可以傳遞備忘錄給其他角色。
Android源碼中的實現(xiàn):
Activity中的額onSaveInstanceState和onRestoreInstanceState方法就是在異常退出的時候用來保存Activity狀態(tài)的方法。
里面進行了:
1.存儲窗口的視圖樹狀態(tài)
2.存儲Fragment狀態(tài)
3.調用Activity的ActivityLifecycleCallbacks的onSaveInstanceState函數(shù)進行狀態(tài)存儲。
Android源碼中的備忘錄模式
Activity中有兩個方法onSaveInstanceState和onRestoreInstanceState,當Activity不是正常退出的時候,被殺死前,能保存Activity的信息,也可以用來恢復。
save方法里面做了三件事情:
1.outState.putBundle(WINDOW_HIERARCHY_TAG,mWindow.saveHierarchyState());儲存了窗口視圖樹狀態(tài)。
2.儲存了Fragment狀態(tài)
3.如果用戶設置了Activity的ActivityLifecycleCallbacks,那么調用這些ActivityLifecycleCallbacks的onSaveInstanceState進行存儲狀態(tài)。
他會遍歷所有的子視圖的dispatchSaveInstanceState來存儲狀態(tài),最終遍歷到View,注意:如果View沒有設置id,狀態(tài)就不會被存儲到Bundle中。
Activity銷毀前ActivityThread調用performStopActivityInner函數(shù),做了4件事:
1.判斷是否需要存儲Activity狀態(tài)
2.如果需要存儲Activity狀態(tài),調用onSaveInstanceState函數(shù)
3.將狀態(tài)信息存儲到ActivityClientRecord對象的state字段中
4.調用Activity的onStop方法。
這些狀態(tài)會存儲到mActivityes中
然后Activity重啟時,構建Activity后,就去查詢是否有對應的ActivityClientRecord,如果找到且不為null就去調用Activity的onSaveInstanceState方法獲取UI狀態(tài)然后傳遞給onCreate函數(shù)。
onSaveInstanceState的調用時機
1.當用戶按下Home鍵時候
2.長按Home
3.按下電源鍵
4.啟動新的Activity
5.屏幕切換方向
6.電話打入
等情況,一句話就是不是用戶主動退出或者條狀到其他Activity的時候會保存狀態(tài)。