行为是否类似于 Activity 的工作方式?例如,对于 Activity ,它的工作方式如下:
Activity A启动Activity B,当B在屏幕上时,系统可以移除A如果系统需要,则从内存中获取。按 BACK 后,A 将被重新创建到内存中,就好像它从未离开过一样。
我一直在寻找一个清晰的解释,说明 fragment 在内存方面会发生什么,但没有找到任何东西。它的工作方式相同吗?例如:
Activity C 在其布局中有Fragment F。然后,在某些时候 F 被 Fragment G 替换,但 F 保留在其后堆栈中。
F 会一直保留在内存中直到 C 被杀死,还是系统可以根据需要将其删除?
我真正要问的是,如果我在单个 Activity 中有一堆复杂的 Fragment,我是否会冒内存不足的风险?
最佳答案
看看这个:BackStackRecord.Op.fragment
这就是 fragment 存储在后台堆栈中的方式。注意实时引用,那里既没有使用 WeakReference
也没有使用 SoftReference
。
现在是:FragmentManagerImpl.mBackStack
这是管理器存储后台堆栈的地方。简单的 ArrayList
,同样,没有 WR 或 SR。
这是对 fragment 管理器的引用。
GC 只能收集没有实时引用的对象(不能从任何线程访问)。这意味着,直到您的 Activity 被销毁(因此,FragmentManager
引用消失了),GC 将无法收集返回堆栈中的任何 Fragment 。
请注意,当 Activity 被销毁时,retains state (就像当您将设备切换到横向模式时),它不会在堆栈中保留实际的 Fragment
对象,只保留它们的状态 - Fragment.FragmentState对象,即每次使用保留状态重新创建 Activity 时,都会重新创建后台堆栈中的实际 fragment 。
希望这会有所帮助。
PS 所以,简而言之:是的,您可以通过将 Fragments
添加到 back stack 以及添加许多 View 来查看层次结构。
UPD 考虑到您的示例,F 将保留在内存中,直到 C 被杀死。如果 C 被杀死然后以不同的配置复活 - F 也将被破坏并在不同的对象中重生。因此,F 的内存占用会一直持续到 C 丢失状态或清除返回堆栈。
关于android - 当 Fragment 被替换并放入回栈(或删除)时,它是否保留在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8482606/