Activity,Fragment状态保存

来源:互联网 发布:云计算 科普 编辑:程序博客网 时间:2024/05/01 18:54

Activity

android:alwaysRetainTaskState


     用法<activity android:alwaysRetainTaskState="true/false"></activity>
     用来标记Activity所在的Task的状态是否总是由系统来保持——“true”,表示总是;“false”,表示在某种情形下允许系统恢复Task 到它的初始化状态。默认值是“false”。这个特性只针对Task的根Activity有意义;对其它Activity来说,忽略之。
     一般来说,特定的情形如当用户从主画面重新选择这个Task时,系统会对这个Task进行清理(从stack中删除位于根Activity之上的所有Activivity)。典型的情况,当用户有一段时间没有访问这个Task时也会这么做,例如30分钟。

     然而,当这个特性设为“true”时,用户总是能回到这个Task的最新状态,无论他们是如何启动的。这非常有用,例如,像Browser应用程序,这里有很多的状态(例如多个打开的Tab),用户不想丢失这些状态。

Fragment

setRetainInstance()

为什么会在这儿花一定的篇幅详细说明setRetainInstance()方法呢?因为此方法可以有效地提高系统的运行效率,对流畅性要求较高的应用可以适当采用此方法进行设置。

 Fragment有一个非常强大的功能——就是可以在Activity重新创建时可以不完全销毁Fragment,以便Fragment可以恢复。在onCreate()方法中调用setRetainInstance(true/false)方法是最佳位置。当Fragment恢复时的生命周期如图1-6所示,注意图中的红色箭头。当在onCreate()方法中调用了setRetainInstance(true)后,Fragment恢复时会跳过onCreate()和onDestroy()方法,因此不能在onCreate()中放置一些初始化逻辑,切忌!


activity在什么情况下被销毁?

     用户按回退键
     调用finish
     放在回退栈中太久
     横竖屏切换

前面两种情况下

     系统会认为用户不再需要这个activity了,所以在销毁时不会做任何事
     没有任何浏览方法能倒回去,只能再次启动该app

在第三、四种情况下

     用户可以通过回退键或其他方式浏览回去
     系统会用bundle保存activity的布局状态包括view状态
     然后销毁activity,并在重建activity时恢复以前的状态,无需编程
     但是注意,系统销毁前不一定能保存所有用户希望保存的数据

     系统提供onSaveInstanceState()方法给用户保存额外的数据
     提供onRestoreInstanceState()方法用于重建时恢复
     但是上述方法仅仅保存少量键值对数据,无法保留大量数据

     系统提供onRetainNonConfigurationInstance()用于保留大量的数据
     提供getLastNonConfigurationInstance()用户恢复数据
     注意这个方法不能传递和context有关的东西,比如view、adapter等等,否则会泄露内存
     只能保存自定义的MyDataObject
     注意这个方法已经 deprecated in API level 13. 官网推荐了下述fragment的方法


activity上面有fragment的情况

     官方大力推荐使用fragment来实现模块化,如果activity上面有fragment
     那么有一个在销毁重建activity时透传fragment状态的方法 setRetainInstance()
     方法解释在 http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance(boolean)
     简单实践了一下,似乎存在一些问题,可能和activity与fragment的连接和分工有关
     似乎从fragment到activity方向的连接或指针正常
     但是从activity到fragment的连接或指针却不对了,activity无法更新fragment
     在我的项目的实践结果是
          fragment上面的数据,比如listview,原本和下面的activity里面的list是对应的,但是透传之后不对应了

     网上找到一些相关讨论。stackoverflow上面相关讨论
          http://stackoverflow.com/questions/11160412/why-use-fragmentsetretaininstanceboolean
          http://stackoverflow.com/questions/11182180/understanding-fragments-setretaininstanceboolean?lq=1
          http://stackoverflow.com/questions/5996446/fragments-setretaininstancetrue-and-threaded-libraries

     一篇专门的博客 Handling Configuration Changes with Fragments
          http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

防止activity被销毁重建

     横竖屏切换时
          横竖屏切换时导致activity销毁和重建
          这个动作的目的是担心activity的布局及资源不适合横竖屏切换
          通过销毁重建给程序一个机会来适配
          但实际上,如果布局和资源没有和横竖屏绑定的话
          其实没必要做这个销毁,完全可以取消这个相当危险的操作
          取消方法是在activity的属性中添加 android:configChanges="orientation|screenSize"

     放在回退栈中太久
          android:alwaysRetainTaskState="true" ----- 始终维持activity的状态
          似乎这个属性可用,但我不很肯定
          注意文档说明这个方法只对任务栈中第一个activity有效


0 0
原创粉丝点击