繁体   English   中英

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

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

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

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

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

onDetachedFromWindowonDestroy绑定

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

很多次,我都有使用这种方法 (onDetachedFromWindow) 取消注册观察者和/或清除作用域的冲动……

不要这样做!!

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

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

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

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

最难/最好的方法是监听 Fragment 的生命周期(如果你想要一个一次性实例化的适配器),然后通过适配器向所有观察适配器的视图发送一个“销毁”消息,并让它们自行注销自己...... . 甚至没有构建 DataSetObserver 类来执行此操作(当它应该时)。

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

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

 "keyboardHidden|orientation|screenSize"

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

最后在活动onResume()之后,不会再次调用onAttachedToWindow()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM