Activity、Window和View三者間的關系有一定的見解


一、簡述如何將Activity展現在手機上

Tips:

Activity本身是沒辦法處理顯示什么控件(view)的,是通過PhoneWindow進行顯示的

換句話說:activity就是在造PhoneWindow,顯示的那些view都交給了PhoneWindow處理顯示

1、在Activity創建時調用attach方法:

2、attach方法中會調用PolicyManager.makeNewWindow()

實際工作的是IPolicy接口的makeNewWindow方法

①、其中創建了一個window(可以比喻為一個房子上造了一個窗戶):mWindow = PolicyManager.makeNewWindow(this);

②、在window這個類中,才調用了setContentView(),這是最終的調用

       在Activity的setContentView方法中,實際上是調用:getWindow().setContentView(view, params);

       這里的getWindow()就是獲取到一個Window對象

Tips:

       為啥attch優先於onCreate調用,就是由於在attch方法中,會創建window,有了window才能調用setContentView

3、在IPolicy的實現類中創建了PhoneWindow:

①、由mWindow = PolicyManager.makeNewWindow(this);,

②、這里的makeNewWindow(this);方法中,返回的是:return sPolicy.makeNewWindow(context);

③、這個sPolicy實際是一個接口,其實現類是Policy,其中只是創建了一個PhoneWindow

4、在PhoneWindow的setContentView中向ViewGroup(root)中添加了需要顯示的內容

①、PhoneWindow是繼承Window的

②、setContentView這個方法中,需要先判斷一個mContentParent是否為空,因為在默認進來的時候,什么都沒創建呢

       此時需要創建:installDecor(),DecorView是最根上的顯示的

       可以通過adt中的的tools中有個hierarchyviewer.bat的工具,可以查看手機的結構

③、DecorView:是繼承與FrameLayout的,作為parent存在,最初顯示的

④、下次再加載的時候,mContentParent就不為空了,會將其中的所有的view移除掉,然后在通過布局填充器加載布局

二、三者關系:

1、在Activity中調用attach,創建了一個Window

2、創建的window是其子類PhoneWindow,在attach中創建PhoneWindow

3、在Activity中調用setContentView(R.layout.xxx)

4、其中實際上是調用的getWindow().setContentView()

5、調用PhoneWindow中的setContentView方法

6、創建ParentView:

       作為ViewGroup的子類,實際是創建的DecorView(作為FramLayout的子類)

7、將指定的R.layout.xxx進行填充

通過布局填充器進行填充【其中的parent指的就是DecorView】

8、調用到ViewGroup

9、調用ViewGroup的removeAllView(),先將所有的view移除掉

10、添加新的view:addView()

 

Tips:

       ①、Activity就是在造“窗戶”,即創建PhoneWindow

       ②、PhoneWindow才是進行顯示view的操作,主要就是setContentView()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM