备忘录模式是一种行为模式,该模式用于保存对象当前的状态,并且在之后可以再次恢复到此状态,要注意要保证被保存的对象状态不能被对象从外部访问。
使用场景:
1.要保存一个对象在某一个时刻的状态或者部分状态
2.如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节并破坏对象的封装性,一个对象补西王外界直接访问其内部状态,通过中间对象可以间接访问其内部状态。
类图:
Originator是需要保存状态的对象类,里面可以创建和恢复自身状态。
Memento是备忘录角色,用来存储Originator的内部状态
Caretaker 负责存储备忘录,不能对备忘录的内容进行操作和访问,只是可以传递备忘录给其他角色。
Android源码中的实现:
Activity中的额onSaveInstanceState和onRestoreInstanceState方法就是在异常退出的时候用来保存Activity状态的方法。
里面进行了:
1.存储窗口的视图树状态
2.存储Fragment状态
3.调用Activity的ActivityLifecycleCallbacks的onSaveInstanceState函数进行状态存储。
Android源码中的备忘录模式
Activity中有两个方法onSaveInstanceState和onRestoreInstanceState,当Activity不是正常退出的时候,被杀死前,能保存Activity的信息,也可以用来恢复。
save方法里面做了三件事情:
1.outState.putBundle(WINDOW_HIERARCHY_TAG,mWindow.saveHierarchyState());储存了窗口视图树状态。
2.储存了Fragment状态
3.如果用户设置了Activity的ActivityLifecycleCallbacks,那么调用这些ActivityLifecycleCallbacks的onSaveInstanceState进行存储状态。
他会遍历所有的子视图的dispatchSaveInstanceState来存储状态,最终遍历到View,注意:如果View没有设置id,状态就不会被存储到Bundle中。
Activity销毁前ActivityThread调用performStopActivityInner函数,做了4件事:
1.判断是否需要存储Activity状态
2.如果需要存储Activity状态,调用onSaveInstanceState函数
3.将状态信息存储到ActivityClientRecord对象的state字段中
4.调用Activity的onStop方法。
这些状态会存储到mActivityes中
然后Activity重启时,构建Activity后,就去查询是否有对应的ActivityClientRecord,如果找到且不为null就去调用Activity的onSaveInstanceState方法获取UI状态然后传递给onCreate函数。
onSaveInstanceState的调用时机
1.当用户按下Home键时候
2.长按Home
3.按下电源键
4.启动新的Activity
5.屏幕切换方向
6.电话打入
等情况,一句话就是不是用户主动退出或者条状到其他Activity的时候会保存状态。