对 Android 如何处理活动感到困惑

confused about how Android handles the activities

我对 Android 如何处理这些活动感到有点困惑。 我参与了一个包含 3 个主要活动的项目:

如果我在 C 并且调用了 OnDestroyed(),例如因为方向改变,B 是否也被破坏了?当我回到 B 时,我会在同一点得到相同的列表吗?

如果B因为资源不足隐藏时销毁,再次调用onCreate(),如何恢复整个列表?如何在不再次向服务器请求的情况下恢复列表?

您应该使用 onSaveInstanceState 保存状态并通过 savedInstanceState 从 onCreate 恢复,阅读

中的更多信息

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

您可以考虑为您的列表+详情页面使用片段。对于屏幕旋转持久性,您可以在 onSaveInstanceState 中保存任何重要信息。关于来自服务器的数据,最好的做法是将数据保存在本地设备数据库中,可以使用 SQLite 或任何库,例如 Realm.io。

所以你的项目应该包括:

  1. Activity 用于登录

  2. 应用程序的主要 Activity 将管理 2 个片段,一个用于列表数据,一个用于详细信息页面。

如果您不希望数据保留在设备上,从列表片段下载后,您可以将数据保存在不会被杀死的 MainActivity 中。

If I am at C and OnDestroyed() is called, for example because an orientation change, is B also destroyed?

没有。当 Activity B 启动 Activity C 时,Activity B 停止并继续返回堆栈 - 因为它不再可见,此时方向的概念无关紧要。换句话说,Activity B 在其之前的状态下是 'frozen'。破坏和重新创建可见 Activity(在本例中为 Activity C)的唯一原因是 Activity 在不同方向的外观/感觉/行为可能略有不同,因此销毁/重新创建可见的 Activity 是确保重新开始的最干净的方法。

when I come back to B, will I get the same list at the same point?

这取决于。设想以下两种情况...

场景一

  • 纵向,ActivityB开始ActivityC
  • 用户将 phone 旋转为横向。
  • Activity C 被销毁/重建。返回堆栈上的所有其他 Activity 不受影响
  • 用户旋转phone回纵向
  • Activity C 再次被销毁/重建
  • 用户按下后退按钮 Activity C 被永久销毁
  • Activity B 重新启动并经历重新启动/启动/恢复生命周期阶段,并重新出现完整的所有数据和之前的状态。

场景二

  • 纵向,ActivityB开始ActivityC
  • 用户将 phone 旋转为横向。
  • Activity C 被销毁/重建。返回堆栈上的所有其他 Activity 不受影响
  • 用户按下后退按钮 Activity C 被永久销毁
  • Activity 由于 phone 是横向的
  • ,B 以侧卧的方式短暂地重新出现
  • 由于方向改变,Activity B 在景观中被破坏/重建。这导致它经历创建、开始、恢复。任何以前的数据/状态显然都丢失了。

If B is destroyed when hidden because low resources...

极不可能

...and onCreate() is called again, how do I recover the whole list? How can I recover the list without requesting it to the server again?

正如我在场景 2 中所说,每当 Activity B 被销毁/重新创建时,它将经历其整个生命周期——如果这包括从服务器下载列表,那么就会发生这种情况。然而,有一些方法可以解决这个问题,例如使用 onSaveInstanceState() 或简单地将列表数据缓存在本地某处并从缓存中重新加载。