View,Activity,Window三者的關係

2021-07-03 12:03:28 字數 2245 閱讀 1645

在activity中,通過setcontentview就可以顯示xml的布局檔案了,也就是把乙個個view控制項組合在一起,首先,這個activity的方法setcontentview有三個過載的方法。

public void setcontentview(int layoutresid) 

public void setcontentview(view view)

public void setcontentview(view view, viewgroup.layoutparams params)

可以看出,三個方法什麼也沒用做,只是呼叫了getwindw方法。看一下getwindow方法,僅僅是

public window getwindow()

mwindwow是在attach方法中建立的,看一看attach方法。有這兩行**

mwindow = policymanager.makenewwindow(this);

mwindow.setcallback(this);

首先,看看policymanager.makenewwindow(this)是如何處理的。

//通過反射的方式,建立乙個ipolicy的例項物件。

public final class policymanager catch (classnotfoundexception ex) catch (instantiationexception ex) catch (illegalacces***ception ex)

} // 建構函式私有,保證是單例類

private policymanager() {}

// the static methods to spawn new policy-specific objects

public static window makenewwindow(context context)

public static layoutinflater makenewlayoutinflater(context context)

public static windowmanagerpolicy makenewwindowmanager()

}

檢視policy原始碼會發現,是new了乙個phonewindow的例項。那麼getwindow返回的就是乙個phonewindow了。裡面肯定也有三個setcontentview方法了。

public void setcontentview(int layoutresid) else

//載入xml布局到mcontentparent中,所以,我們可以猜想installdecor();肯定是可以得到乙個mcontentparent的。

mviewinflate.inflate(layoutresid, mcontentparent, minflateparams);

在activity的attach方法中,還記得我們執行了一句mwindow.setcallback(this);由此看見,這個cb就是這個activity自己。當activity發生變化,就會執行oncontentchanged方法。

android.view.window.callback cb = getcallback();

if(cb != null)

cb.oncontentchanged();

}

檢視installdecor方法

private void installdecor() 

}if (mcontentparent == null)

}

看一下如果mcontentparent為null的時候,如何進行的。

protected viewgroup generatelayout(decorview decor)

根據上面的分析,可以知道setcontentview都做了哪些事情。

1:獲得phonewindow物件。

2:判斷是否存在mcontentparent,不存在的話就安裝乙個decorview,作為整個介面的根布局,裡面有乙個flamelayout,其實就是mcontentparent,而我們setcontentview,把xml或者view作為mcontentparent的子view來處理。

KVM Qemu Libvirt三者之間的關係

原始出處 作者資訊和本宣告。否則將追究法律責任。qemu qemu 是乙個模擬器,它向 guest os 模擬cpu 和其他硬體,guest os 認為自己和硬體直接打交道,其實是同 qemu 模擬出來的硬體打交道,qemu 將這些指令轉譯給真正的硬體。由於所有的指令都要從 qemu 裡面過一手,因...

KVM Qemu Libvirt三者之間的關係

在所謂的kvm技術中,應用到的其實有2個東西 qemu kvm kvm負責cpu虛擬化 記憶體虛擬化,實現了cpu和記憶體的虛擬化,但kvm不能模擬其他裝置 qemu是模擬io裝置 網絡卡,磁碟 kvm加上qemu之後就能實現真正意義上伺服器虛擬化。因為用到了上面兩個東西,所以一般都稱之為qemu ...

KVM Qemu Libvirt三者之間的關係

qemu qemu 是乙個模擬器,它向 guest os 模擬cpu 和其他硬體,guest os 認為自己和硬體直接打交道,其實是同 qemu 模擬出來的硬體打交道,qemu 將這些指令轉譯給真正的硬體。由於所有的指令都要從 qemu 裡面過一手,因而效能較差 kvm是linux核心的模組,它需要...