【发布时间】:2012-11-30 15:13:14
【问题描述】:
这两种方法我都用过:
- 让活动在轮换时被销毁
- 不要让活动在轮换时被破坏
我的方法几乎每次都是捕捉旋转事件,如果需要,调用 setContentView 并再次添加一些组件。如果没有,就让它旋转,布局会自动适应。
到目前为止,我只看到在具有非常复杂的动态结构的屏幕上销毁它的优势,并且每当我旋转而不是销毁时,在重新构建屏幕时会显示一些闪烁。
必须使用 onSaveInstance 传递状态的开销,onRestoreInstace 有时很容易出错,而且不知何故很耗时。
我错过了什么吗?
更新:
我没有在我的代码上执行任何类型的 if "Orientation.XPTO == ..."。这是两种方法中的每一种的逻辑(代码被重用):
破坏时
onCreate -> DrawUI() setContentView and add views -> fill() add content
未销毁时:
onCreate -> DrawUI() setContentView and add views -> fill() add content
onRotation -> DrawUI() setContentView and add views -> fill() add content
当在旋转后调用 setContentView 时,它会为设备方向选择正确的布局(检查这个答案由谷歌的 Reto Meier https://stackoverflow.com/a/456918/327011 )
DrawUI 和填充必须具有纵向和横向布局的逻辑,因为可以在两个方向中的每一个上创建活动。
【问题讨论】:
-
"如果重新启动活动需要您恢复大量数据、重新建立网络连接或执行其他密集操作,那么由于配置更改而完全重新启动可能会降低用户体验. 此外,您可能无法使用系统通过
onSaveInstanceState()回调为您保存的Bundle完全恢复您的活动状态——它不是为携带大型对象(如位图)和数据而设计的其中必须先序列化然后反序列化,这会消耗大量内存并使配置更改变慢。”