windowManager.addView(overLayView, params);
.....
//WindowManagerImpl
@Override
public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
applyDefaultToken(params);
mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow);
}
//WindowManagerGlobal
public void addView(View view, ViewGroup.LayoutParams params,
Display display, Window parentWindow) {
root = new ViewRootImpl(view.getContext(), display);
view.setLayoutParams(wparams);
mViews.add(view);
mRoots.add(root);
mParams.add(wparams);
root.setView(view, wparams, panelParentView);
}
//ViewRootImpl
/**
* We have one child
*/
public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
mAttachInfo.mRootView = view;
if (panelParentView != null) {
mAttachInfo.mPanelParentWindowToken
= panelParentView.getApplicationWindowToken();
}
mAdded = true;
res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,
getHostVisibility(), mDisplay.getDisplayId(),
mAttachInfo.mContentInsets, mAttachInfo.mStableInsets,
mAttachInfo.mOutsets, mInputChannel);
}
每個activity中附帶一個window饲窿。在service中addView會新建一個window,生命周期伴隨整個APP。
WindowManagerImpl是客戶端WindowManager管理接口的實現(xiàn),WindowManagerImpl內(nèi)部維護一個單例的WindowManagerGlobal對象,WindowManagerImpl通過該對象轉(zhuǎn)發(fā)客戶端的窗口管理請求肆汹。客戶端在創(chuàng)建窗口時首先調(diào)用getWindowManager獲得本地窗口管理對象予权,并調(diào)用其addView昂勉、removeView、UpdateViewLayout為窗口進行布局控制
ViewManagerImp是Viewmanager的實現(xiàn)扫腺,該類并沒有直接實現(xiàn)Window的操作岗照,而是由WindowmanagerGlobal進行操作。
WindowManagerGlobal對象內(nèi)部維護一個ViewRootImpl實例數(shù)組和一個View視圖對象數(shù)組笆环,WindowmanagerGlobal的addView函數(shù)首先查看要添加的視圖是否已經(jīng)存在攒至,若不存在則實例化一個ViewRootImpl對象,并把view和ViewRootImpl對象及布局參數(shù)保存到本地數(shù)組中躁劣,接著調(diào)用ViewRootImpl對象的setView函數(shù)迫吐;removeView通過調(diào)用ViewRootImpl的die方法進行,最終調(diào)用dispatchDetachedFromWindow進行移除;updateViewLayout首先更新View的LayoutParams并替換掉老的LayoutParams账忘,接著更新ViewRootImpl的Layoutparams,通過調(diào)用scheduleTraversals對View重新布局
作者:黃俊彬
鏈接:http://www.reibang.com/p/f7050a38949d
Window 有三種類型志膀,分別是應用 Window熙宇、子 Window 和系統(tǒng) Window。應用類 Window 對應一個 Acitivity溉浙,子 Window 不能單獨存在烫止,需要依附在特定的父 Window 中,比如常見的一些 Dialog 就是一個子 Window戳稽。系統(tǒng) Window是需要聲明權限才能創(chuàng)建的 Window烈拒,比如 Toast 和系統(tǒng)狀態(tài)欄都是系統(tǒng) Window。
Window 是分層的广鳍,每個 Window 都有對應的 z-ordered,層級大的會覆蓋在層級小的 Window 上面吓妆,這和 HTML 中的 z-index 概念是完全一致的赊时。在三種 Window 中,應用 Window 層級范圍是 1~99行拢,子 Window 層級范圍是 1000~1999祖秒,系統(tǒng) Window 層級范圍是 2000~2999,我們可以用一個表格來直觀的表示:
版權聲明:本文為CSDN博主「王英豪」的原創(chuàng)文章舟奠,遵循CC 4.0 by-sa版權協(xié)議竭缝,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yhaolpz/article/details/68936932