程序员Android技术知识Android知识

每日Android源码设计模式之-12、备忘录模式

2017-03-29  本文已影响0人  Alexey

备忘录模式是一种行为模式,该模式用于保存对象当前的状态,并且在之后可以再次恢复到此状态,要注意要保证被保存的对象状态不能被对象从外部访问。


使用场景:

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的时候会保存状态。

上一篇下一篇

猜你喜欢

热点阅读