Android视图 - onAttachedToWindow和onDetachedFromWindow - 它们何时在活动生命周期中调用?

j2e*_*nue 10 android android-lifecycle

我相信onAttachedToWindow在调用onCreate时onAttachedToWindow()被调用.那么我可以假设在活动生命周期中,当活动被销毁时调用onDetachedFromWindow?我的问题是如何将这两个回调钩子绑定到活动生命周期?

我可以说onAttachedToWindow绑定到onCreate而onDetachedFromWindow绑定到onDestroy吗?

Wen*_*hao 14

技术上讲onAttachedToWindow是在之后调用的onResume(并且它仅在每个生命周期中发生一次). ActivityThread.handleResumeActivitycall将添加DecorView到当前调用的电流WindowManger,WindowManagerGlobal.addView()而不是遍历所有视图并调用onAttachedToWindow每个视图.

onDetachedFromWindow 与...并列 onDestroy


Del*_*ark 7

这并不是真正的答案,而是建议......

很多次,我都感到有必要使用此方法(onDetachedFromWindow)来取消注册观察者和/或清除范围......

不要这样做!!

onDetachedFromWindow() 不等于Fragment 的onDestroyView()。

当视图被销毁时,没有专门调用的内部方法(不幸的是)。

当更改 ViewPager/ViewPager2 中的页面时,将调用 onDetachFromWindow(),而视图并未真正被销毁。如果您使用 onDetachFromWindow() 清除范围,您将收到 NullPointerException,或者在滚动回相关页面时视图将停止响应更新。

您可以做的最好和最简单的事情是使用 onDestroyView() 方法来清除范围。

最难/最好的方法是监听片段的生命周期(如果您想要一个一次性实例化的适配器),然后通过适配器向所有观察适配器的视图发送一条“销毁”消息,并使它们自行注销...... .甚至连 DataSetObserver 类也不是为了执行此操作而构建的(当它应该这样做时)。