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

Android view - onAttachedToWindow and onDetachedFromWindow - when are they called in the activity lifecycle?

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

我可以说 onAttachedToWindow()onCreate() 相关,onDetachedFromWindow()onDestroy() 相关吗?

从技术上讲,onAttachedToWindowonResume 之后调用(并且每个生命周期只发生一次)。 ActivityThread.handleResumeActivity 调用会将 DecorView 添加到当前 WindowManger,后者又会调用 WindowManagerGlobal.addView(),然后遍历所有视图并在每个视图上调用 onAttachedToWindow

onDetachedFromWindowonDestroy

并列

我发现在调用 setContentView 时可能会调用 onAttachedToWindow

当你在AndroidN上使用分屏时,AndroidManifest.xml中activity的configChanges值要设置:

 "keyboardHidden|orientation|screenSize"

onAttachedToWindow会在setContentView中调用,因为window的decorview中的变量"mAttachInfo"不为null,当你调用setContentViewrootView添加到decorView,在addViewInner()中调用dispatchAttachedToWindow

终于在activityonResume()之后,onAttachedToWindow()不再被调用

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

很多次,我都有使用这种方法 (onDetachedFromWindow) 取消注册观察者的冲动and/or 清除范围...

不要这样做!!

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

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

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

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

hardest/best方式是监听Fragment的LifeCycle(如果你想要一个一次性实例化的Adapter),然后通过Adapter向所有观察Adapter的视图派发一个“destroyed”消息并使它们自行取消注册....甚至 DataSetObserver class 都不是为执行此操作而构建的(当它应该时)。