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

时间:2017-02-09 00:21:56

标签: android android-lifecycle

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

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

3 个答案:

答案 0 :(得分:10)

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

onDetachedFromWindowonDestroy

绑定

答案 1 :(得分:2)

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

在Android N上使用分屏时,设置configChanges中活动的AndroidManifest.xml的值:

 "keyboardHidden|orientation|screenSize"

onAttachedToWindow将在setContentView中调用,因为当您调用setContentView添加rootView时,窗口装饰视图中的变量“mAttachInfo”不为空在decorView中调用了dispatchAttachedToWindowaddViewInner()

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

答案 2 :(得分:0)

这实际上不是答案,而是建议...

很多时候,我感到有使用此方法(onDetachedFromWindow)取消注册观察者和/或清除范围的冲动...

不要这样做!

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

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

当在ViewPager / ViewPager2中更改页面时,

onDetachFromWindow()将被调用,而视图实际上并没有被破坏。 如果使用onDetachFromWindow()清除作用域,则将获得NullPointerException,或者当滚动回相关页面时,视图将仅停止响应更新。

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

最困难/最好的方法是侦听Fragment的生命周期(如果您想一次实例化适配器),然后通过适配器向观察适配器的所有视图发送“销毁”消息,并使它们自己自行注销....(即使应该使用)DataSetObserver类也不是这样做的。