android UI結構 (1)Activity 與 Window

yangxi_001發表於2013-11-20

Android PhoneWindow,ViewRoot,Activity之間的大致關係。

在android裡,我們都知道activity.但是一個activity跟一個Window是一個什麼關係呢?

在activity.java中,我們可以看到兩個變數,分別是:

private Window mWindow;

private WindowManager mWindowManager;

這這個變數是在哪裡賦值的呢?可以看到attach函式,

mWindow = PolicyManager.makeNewWindow(this);

跟進去看一下,可以發現返回的時候一個PhoneWindow物件,PhoneWindow是Window類的派生類。

mWindow.setWindowManager(null, mToken, mComponent.flattenToString());

if (mParent != null) {

mWindow.setContainer(mParent.getWindow());

}

mWindowManager = mWindow.getWindowManager();

仔細跟蹤下這段程式碼中我們可以得到WindowManager物件,並且這個物件是在系統唯一的,這個物件同樣被賦值給PhoneWindow的成員變數。

我們在新建一個activity的時候,往往喜歡用如下的程式碼來定義該activity的UI介面,那麼這個具體的實現是怎麼來實現的呢?

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

我們跟蹤setContentView就知道了。可以發現activity其實把這個操作交給了自己的mWindow來完成,通過跟蹤PhoneWindow中的setContentView函式可以得出以下知識:

1,每一個PhoneWiondow中都有一個叫DecorView的物件,該物件是該PhoneWiondow的框架view,可以找到這麼一段程式碼:

View in = mLayoutInflater.inflate(layoutResource, null);

decor.addView(in, new ViewGroup.LayoutParams(FILL_PARENTFILL_PARENT));

該layoutResource則是資源ID,通過往上翻程式碼就可以找得到。

2,一個PhoneWiondow中都有一個叫FrameLayout的物件mContentParent,該物件是從上述layoutResource中的佈局xml中獲得的,這也將是activity中所有使用者新增加view都會被包含在這個物件當中。

總體可以這樣大致說明:一個activity包含有一個PhoneWiondow物件,而所有的UI部件都是放在PhoneWiondow中。

相關文章