对 Android 如何处理活动感到困惑
confused about how Android handles the activities
我对 Android 如何处理这些活动感到有点困惑。
我参与了一个包含 3 个主要活动的项目:
- A.- 初始/欢迎屏幕
- B.- 关于新闻的列表视图
- C.- 当用户在列表视图中触摸新的时显示的新闻描述
如果我在 C 并且调用了 OnDestroyed(),例如因为方向改变,B 是否也被破坏了?当我回到 B 时,我会在同一点得到相同的列表吗?
如果B因为资源不足隐藏时销毁,再次调用onCreate(),如何恢复整个列表?如何在不再次向服务器请求的情况下恢复列表?
您应该使用 onSaveInstanceState 保存状态并通过 savedInstanceState 从 onCreate 恢复,阅读
中的更多信息
http://developer.android.com/training/basics/activity-lifecycle/recreating.html
您可以考虑为您的列表+详情页面使用片段。对于屏幕旋转持久性,您可以在 onSaveInstanceState 中保存任何重要信息。关于来自服务器的数据,最好的做法是将数据保存在本地设备数据库中,可以使用 SQLite 或任何库,例如 Realm.io。
所以你的项目应该包括:
Activity 用于登录
应用程序的主要 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()
或简单地将列表数据缓存在本地某处并从缓存中重新加载。
我对 Android 如何处理这些活动感到有点困惑。 我参与了一个包含 3 个主要活动的项目:
- A.- 初始/欢迎屏幕
- B.- 关于新闻的列表视图
- C.- 当用户在列表视图中触摸新的时显示的新闻描述
如果我在 C 并且调用了 OnDestroyed(),例如因为方向改变,B 是否也被破坏了?当我回到 B 时,我会在同一点得到相同的列表吗?
如果B因为资源不足隐藏时销毁,再次调用onCreate(),如何恢复整个列表?如何在不再次向服务器请求的情况下恢复列表?
您应该使用 onSaveInstanceState 保存状态并通过 savedInstanceState 从 onCreate 恢复,阅读
中的更多信息http://developer.android.com/training/basics/activity-lifecycle/recreating.html
您可以考虑为您的列表+详情页面使用片段。对于屏幕旋转持久性,您可以在 onSaveInstanceState 中保存任何重要信息。关于来自服务器的数据,最好的做法是将数据保存在本地设备数据库中,可以使用 SQLite 或任何库,例如 Realm.io。
所以你的项目应该包括:
Activity 用于登录
应用程序的主要 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()
或简单地将列表数据缓存在本地某处并从缓存中重新加载。