activity 在销毁后恢复时如何从片段管理器中删除片段

How to remove fragment from fragment manager when activity is restored after being destroyed

我有一个 activity A,其中包含片段 F。A 通过将 F 推入片段管理器的返回堆栈来显示 F。此片段可能会显示一个对话框(更具体地说,一个 DialogFragment)D,也可以将其推送到同一个片段管理器的返回堆栈。

我需要能够在由片段 F 确定的某些情况下关闭对话框 D。通常我会检查 D 是否在片段管理器的返回堆栈上并使用 getFragmentManager().popBackStack() 将其删除。但是,如果 activity 被销毁然后重新创建,这将不起作用:

假设我在 Android 设置中设置了 "Don't keep activities" 标志。现在我后台应用程序。 Activity 被摧毁,碎片也被摧毁。现在我再次将应用程序置于前台。 片段 F 和 D 在什么时候被添加到片段管理器的后台堆栈? 这是我在 A 的 onPostResume() 方法上设置断点后截取的屏幕截图,我认为这是activity 生命周期中 运行 的最后一个,在用户可以使用该应用程序之前:

您可能注意到 mAdded 字段包含 2 个元素 - 它们是恢复的片段 F 和 D。但是它们还不在返回堆栈中,因为 mBackStack 为空!

我希望能够删除 D,但 Android 不允许我这样做,因为它正在等待恢复片段的先前状态并且不会将它们添加到后面堆栈直到 onPostResume 之后的某个时间。

所以本质上,我无法从堆栈中删除片段,因为它还不在堆栈中。而且我也无法阻止它在某些时候被添加到堆栈中,因为,正如您从上面的屏幕截图中看到的那样,片段管理器将它存储在一个单独的列表 mAdded 中,并且我无法使用任何方法将它从中删除m已添加。

如何防止保存的片段被恢复?

也许我错了,但如果 activity 停止,AFAIK AOS 根本不会存储片段后退堆栈。它只能恢复最后显示的片段,而堆栈上没有所有以前的片段。
但是,您可以自己存储堆栈和片段状态。只需在 onPause 中删除您的对话框,通过 onSaveInstanceState 存储一些标志,然后在 onResume 中恢复它或不恢复它。