一、簡述如何將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()