Android 未使用setRetainInstance调用onAttach()(true);

Android 未使用setRetainInstance调用onAttach()(true);,android,android-fragments,Android,Android Fragments,我有一个包含单个子片段的父片段,该片段的onAttach和onCreateView方法都被记录下来以进行调试 当我以这种方式将父片段添加到活动中时: parent.setRetainInstance(false); 旋转后的输出如下所示: 07-08 20:10:52.295: E/TAG(14216): Parent's onAttach called! 07-08 20:10:52.295: E/TAG(14216): Parent's onCreateView called! 07-08

我有一个包含单个子片段的父片段,该片段的
onAttach
onCreateView
方法都被记录下来以进行调试

当我以这种方式将父片段添加到活动中时:

parent.setRetainInstance(false);
旋转后的输出如下所示:

07-08 20:10:52.295: E/TAG(14216): Parent's onAttach called!
07-08 20:10:52.295: E/TAG(14216): Parent's onCreateView called!
07-08 20:10:52.305: E/TAG(14216): Child's onAttach called!
07-08 20:10:52.305: E/TAG(14216): Child's onCreateView called!
07-08 20:10:55.395: E/TAG(14216): Parent's onAttach called!
07-08 20:10:55.395: E/TAG(14216): Parent's onCreateView called!
07-08 20:10:55.400: E/TAG(14216): Child's onCreateView called!
但保留如下:

parent.setRetainInstance(true);
输出(旋转后)如下所示:

总之,如果父片段是保留片段,则不会调用子片段的
onAttach
方法(我假设两者都不是
onDetach
)。这个场景只是一个演示,我实际上不得不调试一个复杂的应用程序,以找出导致失败的原因。应用程序存在内存问题,因为在方向更改后,子片段泄漏了以前的活动(作为在onAttach中设置的侦听器)

如果有人有相同的问题,解决方法可能是从父片段的
onAttach
手动调用子片段的
onAttach


问题是:这是一个bug吗?

当您执行setRetainInstance(true)时,片段保留其配置(因此它对嵌套片段的引用,而嵌套片段从未真正分离/附加)。例如,在配置更改(如旋转)期间,可能会发生这种情况

所以这不是一个bug,它是由Android设计的

为了回答您的问题,您可以将活动/侦听器引用保留为WeakReference,以便在不再需要时将其释放

另一方面,我会重新考虑整个想法,似乎您应该在这里有一个观察者模式(在onStop/onPause或类似过程中从侦听器/观察者订阅/取消订阅)


注意:这并不能让它变得更好,我讨厌Android的生命周期方法

我知道配置被保留了,但仍然有一个新的活动需要附加。旋转后不调用ONATACH是一种误导,如果根本不调用它会更好。我可以从父级手动调用它,因此框架也可以这样做。我仍然认为这是一个bug。WeakReference会使片段在旋转后变得无用,因为没有任何侦听器可以调用。-->没有使用新活动调用onAttached,并且旧引用在旋转后丢失。父片段将在onAttach()中具有对新活动的引用,子片段可以从中获取该引用。