android横竖屏切换与activity的销毁重建

http://blog.csdn.net/max2005/article/details/18754739

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有效

你可能感兴趣的:(android)