1

我有问题。我现在正在学习Android 中的活动生命周期。我在设备的方向改变方面遇到了一些麻烦。管理朝向变化的活动状态(Android)

在我的特殊情况下,我有一个非常复杂的数据结构的活动。 由于我不喜欢保留的片段方法将此对象传递给新创建的活动,因此我将使用不赞成使用的方法,因为我感觉它的重量更轻。使用 这有什么大缺点吗?

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

回答

1

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

因此,无论我的应用程序是否支持横向模式,我总是确保方向更改无缝工作以重新创建状态,而无需使用任何类似onRetainNonConfigurationInstance。

这里有一个简单的测试来运行它是由OS发布后,检查应用程序的状态娱乐:

  1. 问题打开应用程序页面。
  2. 按下手机上的“主页”按钮。
  3. 用长滚动listViews(我使用Facebook,Youtube和Google Play商店)打开不少于3个高资源使用率应用程序。
  4. 在每个应用程序中,向下滚动listview以便使用系统资源。
  5. 完成全部3个应用后,请重新打开您的应用。

发生了什么事?如果你已经正确地保存你的状态,你应该看到应用程序从保存的savedInstanceState包中重新创建视图。您还可以看到丢失数据或空指针异常的重新创建的视图。

至于你的第二点,smitalm是正确的,操作系统在正确配置的时候会为你保存基本视图元素的状态。欲了解更多信息,请查看Recreating an Activity documentation

希望这会有所帮助。

2

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

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

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

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

如果您不想使用Parcelable,您可以将您的对象序列化为JSON字符串,并将该字符串绑定到Bundle - Bundle已经支持字符串。然后,在onRestoreInstanceState()中将您的JSON反序列化回Java对象。

至于JSON序列化,我强烈建议google GSON这个工作。

+0

问题是我的数据结构非常复杂。我宁愿优先考虑编写一个JSON序列化程序(我将稍后需要),而不是在结构Parcelable中创建每个对象。但是,我仍然觉得这是一项简单任务的开销(“请不要做任何事情”)。 – Chris

+0

@Chris我同意,为了节省状态,感觉工作太多了,但那就是Android的设计:)。您可以序列化为JSON字符串,并将字符串转换为字符串(因为字符串已支持字符串),而不是使用parcelable,请参阅已更新的答案。 – hendrix