我相信在调用onCreate setContentView(R.layout.myLayout.xml)
时会调用onAttachedToWindow。那么我可以假设在活动生命周期中,当活动被销毁时调用onDetachedFromWindow?我的问题是如何将这两个回调钩子绑定到活动生命周期?
我可以说onAttachedToWindow绑定到onCreate而onDetachedFromWindow绑定到onDestroy吗?
答案 0 :(得分:10)
从技术上讲,onAttachedToWindow
之后会调用onResume
(并且每个生命周期只会发生一次)。
ActivityThread.handleResumeActivity
来电将DecorView
添加到当前WindowManger
,后者将调用WindowManagerGlobal.addView()
,而不是遍历所有观看次数,并在每个视图上调用onAttachedToWindow
。
onDetachedFromWindow
与onDestroy
答案 1 :(得分:2)
我发现调用onAttachedToWindow
时可能会调用setContentView
。
在Android N上使用分屏时,设置configChanges
中活动的AndroidManifest.xml
的值:
"keyboardHidden|orientation|screenSize"
onAttachedToWindow
将在setContentView
中调用,因为当您调用setContentView
添加rootView
时,窗口装饰视图中的变量“mAttachInfo”不为空在decorView
中调用了dispatchAttachedToWindow
,addViewInner()
。
最后,在活动onResume()
之后,不会再次调用onAttachedToWindow()
。
答案 2 :(得分:0)
这实际上不是答案,而是建议...
很多时候,我感到有使用此方法(onDetachedFromWindow)取消注册观察者和/或清除范围的冲动...
不要这样做!
onDetachedFromWindow()不等于Fragment的onDestroyView()。
(不幸的是)视图被破坏时,没有专门调用内部方法。
当在ViewPager / ViewPager2中更改页面时,onDetachFromWindow()将被调用,而视图实际上并没有被破坏。 如果使用onDetachFromWindow()清除作用域,则将获得NullPointerException,或者当滚动回相关页面时,视图将仅停止响应更新。
您能做的最好,最简单的事情是使用onDestroyView()方法清除范围。
最困难/最好的方法是侦听Fragment的生命周期(如果您想一次实例化适配器),然后通过适配器向观察适配器的所有视图发送“销毁”消息,并使它们自己自行注销....(即使应该使用)DataSetObserver类也不是这样做的。