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管理接口的實現,WindowManagerImpl內部維護一個單例的WindowManagerGlobal對象,WindowManagerImpl通過該對象轉發客戶端的窗口管理請求。客戶端在創建窗口時首先調用getWindowManager獲得本地窗口管理對象,并調用其addView、removeView、UpdateViewLayout為窗口進行布局控制
ViewManagerImp是Viewmanager的實現,該類并沒有直接實現Window的操作,而是由WindowmanagerGlobal進行操作。
WindowManagerGlobal對象內部維護一個ViewRootImpl實例數組和一個View視圖對象數組,WindowmanagerGlobal的addView函數首先查看要添加的視圖是否已經存在,若不存在則實例化一個ViewRootImpl對象,并把view和ViewRootImpl對象及布局參數保存到本地數組中,接著調用ViewRootImpl對象的setView函數;removeView通過調用ViewRootImpl的die方法進行,最終調用dispatchDetachedFromWindow進行移除;updateViewLayout首先更新View的LayoutParams并替換掉老的LayoutParams,接著更新ViewRootImpl的Layoutparams,通過調用scheduleTraversals對View重新布局
作者:黃俊彬
鏈接:http://www.lxweimin.com/p/f7050a38949d
Window 有三種類型,分別是應用 Window、子 Window 和系統 Window。應用類 Window 對應一個 Acitivity,子 Window 不能單獨存在,需要依附在特定的父 Window 中,比如常見的一些 Dialog 就是一個子 Window。系統 Window是需要聲明權限才能創建的 Window,比如 Toast 和系統狀態欄都是系統 Window。
Window 是分層的,每個 Window 都有對應的 z-ordered,層級大的會覆蓋在層級小的 Window 上面,這和 HTML 中的 z-index 概念是完全一致的。在三種 Window 中,應用 Window 層級范圍是 1~99,子 Window 層級范圍是 1000~1999,系統 Window 層級范圍是 2000~2999,我們可以用一個表格來直觀的表示:
版權聲明:本文為CSDN博主「王英豪」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yhaolpz/article/details/68936932