android wms——DisplayContent

DisplayContent是一個WindowContainer叉趣,其對應于一個屏幕id,對于多屏幕會對應多個DisplayContent讥裤。需要注意DisplayContent代表的是邏輯顯示屏浪腐,而邏輯顯示屏不可能存在子屏,因此在代碼中addChild是被禁止的

class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowContainer> {
    DisplayContent(Display display, WindowManagerService service,
            WallpaperController wallpaperController, DisplayWindowController controller) {
        super(service);
        setController(controller);
        if (service.mRoot.getDisplayContent(display.getDisplayId()) != null) {
            throw new IllegalArgumentException("Display with ID=" + display.getDisplayId()
                    + " already exists=" + service.mRoot.getDisplayContent(display.getDisplayId())
                    + " new=" + display);
        }
        //獲取屏幕相關信息,屏幕id以及屏幕大小
        mDisplay = display;
        mDisplayId = display.getDisplayId();
        mWallpaperController = wallpaperController;
        display.getDisplayInfo(mDisplayInfo);
        display.getMetrics(mDisplayMetrics);
        isDefaultDisplay = mDisplayId == DEFAULT_DISPLAY;
        mDisplayFrames = new DisplayFrames(mDisplayId, mDisplayInfo,
                calculateDisplayCutoutForRotation(mDisplayInfo.rotation));
        initializeDisplayBaseInfo();
        mDividerControllerLocked = new DockedStackDividerController(service, this);
        mPinnedStackControllerLocked = new PinnedStackController(service, this);

        // We use this as our arbitrary surface size for buffer-less parents
        // that don't impose cropping on their children. It may need to be larger
        // than the display size because fullscreen windows can be shifted offscreen
        // due to surfaceInsets. 2 times the largest display dimension feels like an
        // appropriately arbitrary number. Eventually we would like to give SurfaceFlinger
        // layers the ability to match their parent sizes and be able to skip
        // such arbitrary size settings.
        mSurfaceSize = Math.max(mBaseDisplayHeight, mBaseDisplayWidth) * 2;//渲染屏幕的大小計算
       //實例化SurfaceControl
        final SurfaceControl.Builder b = mService.makeSurfaceBuilder(mSession)
                .setSize(mSurfaceSize, mSurfaceSize)
                .setOpaque(true)//設置為透明
                .setContainerLayer(true);
        mWindowingLayer = b.setName("Display Root").build();
        mOverlayLayer = b.setName("Display Overlays").build();

        getPendingTransaction().setLayer(mWindowingLayer, 0)
                .setLayerStack(mWindowingLayer, mDisplayId)
                .show(mWindowingLayer)
                .setLayer(mOverlayLayer, 1)
                .setLayerStack(mOverlayLayer, mDisplayId)
                .show(mOverlayLayer);
        getPendingTransaction().apply();

        // These are the only direct children we should ever have and they are permanent.
       //將下面幾個WindowConatiner的添加到DisplayContent中
        super.addChild(mBelowAppWindowsContainers, null);
        super.addChild(mTaskStackContainers, null);
        super.addChild(mAboveAppWindowsContainers, null);
        super.addChild(mImeWindowsContainers, null);

        // Add itself as a child to the root container.
        //將該displayContent作為子container添加到WMS中的RootWindowContainer
        mService.mRoot.addChild(this, null);

        // TODO(b/62541591): evaluate whether this is the best spot to declare the
        // {@link DisplayContent} ready for use.
        mDisplayReady = true;
    }
}

在構造函數(shù)中,直接添加四個 :

  1. mBelowAppWindowsContainers:NonAppWindowContainers類型,保存了所有應該顯示到App類窗口的下面的非App類的窗口算撮。layer設置為0
  2. mTackStackContainer:保存了所有與App(Activities)相關的Window。layer設置為1
  3. mAboveAppWindowContainer:NonAppWindowContainer類型县昂,保存了所有應該顯示到App類窗口的上面的非App類的窗口肮柜,layer設置為2
  4. mImeWindowContainers:NonAppWindowContainer類型,包含了所有IME window Containers倒彰。


    類簡單示意圖.jpg

從示意圖可以看出审洞,無論是DisplayContent或者添加到四個Containers最終的父類都是WindowContainer.

WindowContainer
作為一個window容器,其主要作用是可以添加同類型的子類狸驳,并建立一個該類型的ArrayList,并且每個子類都能直接獲得其父節(jié)點预明,以便管理

    protected void addChild(E child, Comparator<E> comparator) {
        if (child.getParent() != null) {
            throw new IllegalArgumentException("addChild: container=" + child.getName()
                    + " is already a child of container=" + child.getParent().getName()
                    + " can't add to container=" + getName());
        }

        int positionToAdd = -1;
        if (comparator != null) {
            final int count = mChildren.size();
            for (int i = 0; i < count; i++) {
                if (comparator.compare(child, mChildren.get(i)) < 0) {
                    positionToAdd = i;
                    break;
                }
            }
        }

        if (positionToAdd == -1) {
            mChildren.add(child);
        } else {
            mChildren.add(positionToAdd, child);
        }
        onChildAdded(child);

        // Set the parent after we've actually added a child in case a subclass depends on this.
        child.setParent(this);
    }

其中WindowList<E> mChildren = new WindowList<E>();

在DisplayContent構造函數(shù)中,最終將自己添加到WMS中mRoot作為子耙箍,其為RootWindowContainer撰糠,同樣繼承與WindowContainer,其泛型為DisplayContent辩昆。其為根部windowContainer阅酪。

總結
在WMS中mRoot作為屏幕內(nèi)容管理器保存著對應屏幕的內(nèi)容displayContent,而displayContent作為某一顯示屏幕的內(nèi)容管理器,保存在該屏幕四類顯示的內(nèi)容:顯示到App類窗口的下面的非App類的窗口术辐、與App(Activities)相關的Window砚尽、顯示到App類窗口的上面的非App類的窗口、IME窗口辉词。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末必孤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瑞躺,更是在濱河造成了極大的恐慌敷搪,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幢哨,死亡現(xiàn)場離奇詭異赡勘,居然都是意外死亡,警方通過查閱死者的電腦和手機捞镰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門闸与,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岸售,你說我怎么就攤上這事践樱。” “怎么了凸丸?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵映胁,是天一觀的道長。 經(jīng)常有香客問我甲雅,道長,這世上最難降的妖魔是什么坑填? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任抛人,我火速辦了婚禮,結果婚禮上脐瑰,老公的妹妹穿的比我還像新娘妖枚。我一直安慰自己,他們只是感情好苍在,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布绝页。 她就那樣靜靜地躺著,像睡著了一般寂恬。 火紅的嫁衣襯著肌膚如雪续誉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天初肉,我揣著相機與錄音酷鸦,去河邊找鬼。 笑死,一個胖子當著我的面吹牛臼隔,可吹牛的內(nèi)容都是我干的嘹裂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼摔握,長吁一口氣:“原來是場噩夢啊……” “哼寄狼!你這毒婦竟也來了?” 一聲冷哼從身側響起氨淌,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤泊愧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宁舰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拼卵,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年蛮艰,在試婚紗的時候發(fā)現(xiàn)自己被綠了腋腮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡壤蚜,死狀恐怖即寡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情袜刷,我是刑警寧澤聪富,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站著蟹,受9級特大地震影響墩蔓,放射性物質發(fā)生泄漏。R本人自食惡果不足惜萧豆,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一奸披、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涮雷,春花似錦阵面、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至览爵,卻和暖如春置鼻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拾枣。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工沃疮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盒让,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓司蔬,卻偏偏與公主長得像邑茄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俊啼,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344