我不完全了解如何重新创建活动及其片段。
想象一下以下场景:如果活动对DB
的查询有一些数据,那么您有一个数据库,读取此DB
的活动和一个将创建的片段。如果DB
为空,则片段onCreateView
将导致异常。
现在想象我们将应用程序移动到后台一段时间,活动被破坏了。此外,DB
更改并变为空。
如何重建此结构? Activity开始并理解不需要片段,所以一切正常,或者片段被重新创建然后无论如何,因为它已经被创建了? setRetainInstance(true/false)
会对此流程产生影响吗?
使它更复杂:我们有几个片段,其中一个决定,是否应该以类似的方式创建另一个片段。片段娱乐的顺序是什么?是某种竞争条件还是预定义的订单?
最后,我们如何防止或控制片段的重新创建?我想我有一种情况,有时片段是在正确的时间重新创建的。如何修复这样的架构?只需使用onStop()
删除片段?
答案 0 :(得分:0)
片段的生命周期与Activity的生命周期相关联。来自Android文档:
停止
片段不可见。主机活动已停止或片段已从活动中删除但已添加到后台堆栈。已停止的片段仍处于活动状态(系统会保留所有状态和成员信息)。但是,它不再对用户可见,并且如果活动被杀死将被杀死。
当销毁活动时,它将调用onCreate()
方法重新创建活动。这意味着如果底层数据库已更改,则Activity可以决定不启动该片段。
答案 1 :(得分:0)
我不完全了解活动及其片段是如何发生的 重新创建。
首先,非常清楚如何在Android中使用Activity / Fragments的生命周期。在这里,我链接什么是恕我直言关于这个主题的最完整的图表(甚至比官方的更多):
http://staticfree.info/~steve/complete_android_fragment_lifecycle.svg
想象一下以下场景:你有一个数据库,活动阅读 如果活动的查询,将创建此DB和片段 到DB有一些数据。如果DB为空,则片段的onCreateView将为 引起异常现在假设我们将应用程序移动到了背景中 而活动被破坏了。而且,DB会改变并获得 空。
这种操作,如读取或写入数据库(或连接到Web服务或更多),都被视为I / O,应该在后台正确管理。我不知道你的具体细节,但在你的例子中,你可以使用CursorLoader。 Android文档说明如下:
查询ContentResolver并返回Cursor的加载器。这个 class以标准方式实现Loader协议以进行查询 游标,构建在AsyncTaskLoader上以执行游标查询 后台线程,以便它不会阻止应用程序的UI。
此外
如果DB为空,则片段的onCreateView将导致异常。
如果DB为空,则该片段不应导致异常(any),如果您正在使用CursorLoader,它最终将获得一个带有0个条目的Cursor。稍后(这又取决于您的实现),如果您更新数据库,您可以执行新的CursorLoader请求以获取具有新数据的刷新Cursor(如果您旋转设备,则同样适用)。
Wolfram Rittmeyer 和How to use Loarders由 Alex Lockwood
撰写的两篇很好的教程,深入讨论CursorLoader活动开始并理解不需要片段,所以 一切都很好,或者无论如何重新创建片段,因为它 已经被创造了? setRetainInstance(true / false)是否有 影响这个过程?
一个活动是一个“愚蠢”的组件,它本身并不知道一个片段是什么(这不是真的,因为活动的实现知道片段)。但是为了好的缘故,这实际上取决于你尝试做什么。如果您的活动中有片段,则最终会重新创建。你必须要注意两门课程才能理解这项工作是什么:
最后,我们如何防止或控制片段的重新创建?一世 猜测我有一种情况,有时会重新创建一个片段 在合适的时间。如何修复这样的架构?只是 用onStop()移除片段?
不要自己搞乱生命周期事件,这是由android运行时正确管理的。