让一项活动在轮换中被摧毁有什么好处?

时间:2012-11-30 15:13:14

标签: android rotation

我使用了两种方法:

  1. 让活动在轮换中被销毁
  2. 不要让活动在轮换中被销毁
  3. 我的方法几乎每次都是捕获旋转事件,如果需要调用setContentView并再次添加一些组件。如果没有,只需让它旋转,布局就可以适应。

    到目前为止,我只看到了在具有非常动态的非常复杂结构的屏幕上销毁它的优点,每当我旋转而不是破坏时,在重新构建屏幕时会显示一些闪烁。

    必须使用onSaveInstance,onRestoreInstace传递状态的开销有时非常容易出错,并且不知何故耗费时间。

    我错过了什么吗?

    更新

    我的代码中没有任何“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时,它将为设备方向选择正确的布局(通过Google的Reto Meier https://stackoverflow.com/a/456918/327011检查此答案)

    DrawUI和fill必须具有纵向和横向布局的逻辑,因为可以在两个方向中的每个方向上创建活动。

5 个答案:

答案 0 :(得分:10)

  

我错过了什么吗?

是。您假设您的替代方案在某种程度上不易出错。

通过不进行销毁和重新创建循环,您必须确保为每个可能的配置更改而处理更改每个资源。

  

不要让活动在轮换中被销毁

除非您使用android:screenOrientation强制您的活动进入单一方向(例如landscape),否则您不仅可以处理与轮换相关的配置更改。您需要处理所有配置更改。否则,只要用户将设备放入扩展坞,将其从扩展坞中移除,更改语言设置,附加或分离键盘,更改全局字体缩放等,您的应用就会中断。

这反过来意味着在每次配置更改时,您需要:

  • 更新您的可能新字符串资源的用户界面
  • 调整或重新加载您的布局(以及“调整”,包括更改任何可绘制的内容,动画,菜单等)。
  • 与您的资源相关的任何其他内容(例如,PreferenceFragment中的数组列表)

问题是你会忘记一些事情。例如,您将错过更改与操作栏项关联的字符串,因此现在大部分UI都是西班牙语,操作栏项目是英语。您将要忘记的各种事情将不那么明显(您经常测试您的西班牙语翻译?)。

答案 1 :(得分:3)

您的活动已被销毁,以便您有机会为新方向重新配置自己。

来自developer.android.com:

  

当屏幕改变方向时,系统会破坏并重新创建   前台活动,因为屏幕配置已更改   并且您的活动可能需要加载替代资源(例如   布局)。

例如,在横向模式下,您可能需要完全不同的布局,或者可能需要加载不会显示拉伸的图形。执行此操作的最佳方法是允许再次创建活动,这将允许链接到布局文件以更改为更方向友好的布局。

有关详情以及如何处理方向更改,请参阅http://developer.android.com/training/basics/activity-lifecycle/recreating.html

如果您想禁用娱乐,可以添加

android:configChanges="orientation"

到AndroidManifest.xml中的Activity元素。这样就不会重新加载您的活动。

onSaveInstanceonRestoreInstace只应用于传递会话信息,例如TextField中的当前文本,以及在onCreate之后只能再次加载的通用文件。

答案 2 :(得分:2)

如果您重新启动活动,则需要恢复大量数据,重新建立网络连接或执行其他密集型操作,然后使用onSaveInstanceState()可能会导致您出现以下症状:

  1. 糟糕的用户体验(即“显示一些闪烁的”)
  2. 需要消耗大量内存
  3. onSaveInstanceState()回调不是为了携带大型物品而设计的。

      

    在运行时配置更改期间保留对象:

         

    重写onRetainNonConfigurationInstance()方法以返回您要保留的对象。   再次创建活动后,请致电getLastNonConfigurationInstance()以恢复您的对象。

    <强>然而

      

    虽然您可以返回任何对象,但您永远不应传递与该活动相关联的对象,例如DrawableAdapterView或任何其他对象与Context相关联。如果这样做,它将泄漏原始活动实例的所有视图和资源。 (资源泄漏意味着您的应用程序会保留它们并且不能进行垃圾回收,因此可能会丢失大量内存。)

    Source


    除非你能够顺利通过Object(s),否则我个人认为自己处理配置更改更有利,这意味着不要破坏。

    如果您的目标API为13或更高:您必须在screenSize中加入configChanges。从API 13开始,屏幕尺寸也会随着方向的变化而变化,您需要考虑到这一点。在13之前,您的Activity将自行处理。

    android:configChanges="orientation|screenSize"
    

答案 3 :(得分:0)

对于(风景/肖像)使用不同的布局时,有时会很有用。并使用不同类型的视图,例如纵向为ListView,横向为GridView

答案 4 :(得分:0)

我猜你没有考虑创建android布局的标准方法。如果我错了,请纠正我。你是否分别用 -port,-land 两个res文件夹告诉android系统在运行时选择加载不同的资产和布局。

这个example可以为您提供管理不同方向布局的线索。

这是android stanard document。请查看“土地”和“港口”。

希望这会对你有所帮助。