美文网首页程序员Android技术知识Android知识
每日Android源码设计模式之-12、备忘录模式

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

作者: Alexey | 来源:发表于2017-03-29 21:40 被阅读0次

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


    使用场景:

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

    相关文章

      网友评论

        本文标题:每日Android源码设计模式之-12、备忘录模式

        本文链接:https://www.haomeiwen.com/subject/lmbyottx.html