[英]Detailed android activity lifecycle (onAttachedToWindow())
[英]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()
嗎?
從技術上講, onAttachedToWindow
在onResume
之后調用(並且每個生命周期只發生一次)。 ActivityThread.handleResumeActivity
調用會將DecorView
添加到當前WindowManger
,后者又會調用WindowManagerGlobal.addView()
,然后遍歷所有視圖並在每個視圖上調用onAttachedToWindow
。
onDetachedFromWindow
與onDestroy
綁定
這不是一個真正的答案,而是一個建議......
很多次,我都有使用這種方法 (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,當你調用setContentView
將rootView
添加到decorView
時, dispatchAttachedToWindow
會在addViewInner()
中調用。
最后在活動onResume()
之后,不會再次調用onAttachedToWindow()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.