管理方向变更的活动状态(Android)

时间:2013-11-21 11:05:07

标签: android orientation android-lifecycle orientation-changes

我有一个问题。我正在学习Android中的活动生命周期 在这一刻。我对设备的方向改变有些麻烦。

在我的特定情况下,我有一个具有相当复杂的数据结构的活动。 因为我不喜欢保留片段方法将此对象传递给新对象 创建活动,我将使用已弃用的onRetainNonConfigurationInstance() 方法,因为我觉得它的重量更轻。使用是否有很大的缺点 此?

我经历的另一件事是,例如,当我有活动和观看时 TextEdits定义(在我的情况下在布局XML中),然后我写了一些东西然后导致 一个方向改变,TextEdits保持其状态(写入的文本),即使我不关心它。 怎么解释?

2 个答案:

答案 0 :(得分:2)

如果您的输入具有唯一ID,则在更改方向时将保存其状态。

关于在方向更改时保存活动状态的正确方法,请参阅onSaveInstanceState () and onRestoreInstanceState ()。基本上,当您覆盖onSaveInstanceState (Bundle icicle)时,任何需要的数据都应该放在Bundle中(作为方法参数提供)。

当您覆盖onRestoreInstanceState ()时,您会重新加载这些数据。

另外,如果您需要保存自定义对象,则需要使它们实现Parcelable接口。

如果您不想使用Parcelable,您可以将对象序列化为JSON String并将该String放入Bundle - Bundle已经支持Strings。然后,在onRestoreInstanceState ()中,只需将JSON反序列化为Java对象。

至于JSON序列化,我强烈推荐google GSON来完成这项工作。

答案 1 :(得分:1)

像“onRetainNonConfigurationInstance()”这样的最大问题是它不会考虑在操作系统的流程生命周期中销毁和重新创建应用程序的活动。 See the documentation for this here.基本上,当您的应用程序在后台并且当您使用其他设备应用程序时,操作系统将开始终止进程​​以释放系统资源。当发生这种情况并重新打开您的应用程序时,操作系统会尝试通过savedInstanceState重新创建您的应用程序。

出于这个原因,无论我的应用程序是否支持横向模式,我总是确保方向更改无缝地工作以重新创建状态而不使用onRetainNonConfigurationInstance等任何内容。

这是一个简单的测试,用于在操作系统发布后检查app状态的重新创建:

  1. 将您的应用程序打开到相关页面。
  2. 按下手机上的“主页”按钮。
  3. 使用长滚动列表视图打开不少于3个高资源使用率的应用程序(我使用Facebook,Youtube和Google Play商店)。
  4. 在每个应用程序中滚动列表视图,以便使用系统资源。
  5. 完成所有3个应用后,请重新打开您的应用。
  6. 发生什么事了?如果您已正确处理保存状态,则应该看到应用程序从您保存的savedInstanceState包中重新创建视图。您还可以看到重新创建的视图,其中包含丢失的数据或空指针异常。

    关于你的第二点,smitalm是正确的,操作系统确实在正确配置时处理为你保存基本视图元素的状态。有关详细信息,请查看Recreating an Activity documentation

    希望这有帮助。