国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android 12系統(tǒng)源碼_窗口管理(五)DisplayContent簡介

這篇具有很好參考價值的文章主要介紹了Android 12系統(tǒng)源碼_窗口管理(五)DisplayContent簡介。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

DisplayContent 用于管理屏幕,一塊DisplayContent 對象實例代表一個屏幕設(shè)備,這樣有多個屏幕的設(shè)備就可以創(chuàng)建多個DisplayContent 對象,雖然多數(shù)設(shè)備只有一個顯示屏,但它們同樣可以創(chuàng)建多個 DisplayContent 對象,如投屏的時候,可以創(chuàng)建一個虛擬的DisplayContent。

一、DisplayContent 的創(chuàng)建

1、DisplayContent對象實例的創(chuàng)建最早是在SystemServer中被觸發(fā)的。

frameworks/base/services/java/com/android/server/SystemServer.java

public final class SystemServer implements Dumpable {

    private ActivityManagerService mActivityManagerService;

    private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
    		...代碼省略...
            t.traceBegin("SetWindowManagerService");
            mActivityManagerService.setWindowManager(wm);//創(chuàng)建屏幕設(shè)備對象
            t.traceEnd();
            ...代碼省略...
    }
}

該方法會調(diào)用ActivityManagerService的setWindowManager方法。

2、ActivityManagerService的setWindowManager方法如下所示。

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

public class ActivityManagerService extends IActivityManager.Stub
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback, ActivityManagerGlobalLock {
    
    public WindowManagerService mWindowManager;
    public ActivityTaskManagerService mActivityTaskManager;
    
    public void setWindowManager(WindowManagerService wm) {
        synchronized (this) {
            mWindowManager = wm;
            mWmInternal = LocalServices.getService(WindowManagerInternal.class);
            mActivityTaskManager.setWindowManager(wm);//創(chuàng)建屏幕設(shè)備對象
        }
    }
}

該方法會調(diào)用ActivityTaskManagerService的setWindowManager方法。

3、ActivityTaskManagerService的setWindowManager方法如下所示。

frameworks/base/services/core/java/com/android/server/wm/ActivityTaskManagerService.java

public class ActivityTaskManagerService extends IActivityTaskManager.Stub {

    RootWindowContainer mRootWindowContainer;

    public void setWindowManager(WindowManagerService wm) {
        synchronized (mGlobalLock) {
            mWindowManager = wm;
            mRootWindowContainer = wm.mRoot;//獲取WindowManagerService的RootWindowContainer對象
            mWindowOrganizerController.setWindowManager(wm);
            mTempConfig.setToDefaults();
            mTempConfig.setLocales(LocaleList.getDefault());
            mConfigurationSeq = mTempConfig.seq = 1;
            mRootWindowContainer.onConfigurationChanged(mTempConfig);
            mLockTaskController.setWindowManager(wm);
            mTaskSupervisor.setWindowManager(wm);
            mRootWindowContainer.setWindowManager(wm);//創(chuàng)建屏幕設(shè)備對象
        }
    }
 }

該方法會繼續(xù)調(diào)用RootWindowContainer的setWindowManager方法。

4、DisplayContent對象實例就是在RootWindowContainer的setWindowManager方法中創(chuàng)建的。

frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java

class RootWindowContainer extends WindowContainer<DisplayContent>
        implements DisplayManager.DisplayListener {

    DisplayManager mDisplayManager;
    /** Reference to default display so we can quickly look it up. */
    private DisplayContent mDefaultDisplay;

    void setWindowManager(WindowManagerService wm) {
        mWindowManager = wm;
        mDisplayManager = mService.mContext.getSystemService(DisplayManager.class);
        mDisplayManager.registerDisplayListener(this, mService.mUiHandler);
        mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class);

        final Display[] displays = mDisplayManager.getDisplays();//通過DisplayManager獲取屏幕設(shè)備信息
        for (int displayNdx = 0; displayNdx < displays.length; ++displayNdx) {//遍歷屏幕設(shè)備,為每個設(shè)備創(chuàng)建DisplayContent對象
            final Display display = displays[displayNdx];
            final DisplayContent displayContent = new DisplayContent(display, this);//創(chuàng)建屏幕對象DisplayContent實例
            addChild(displayContent, POSITION_BOTTOM);
            if (displayContent.mDisplayId == DEFAULT_DISPLAY) {
                mDefaultDisplay = displayContent;
            }
        }
        calculateDefaultMinimalSizeOfResizeableTasks();

        final TaskDisplayArea defaultTaskDisplayArea = getDefaultTaskDisplayArea();
        defaultTaskDisplayArea.getOrCreateRootHomeTask(ON_TOP);
        positionChildAt(POSITION_TOP, defaultTaskDisplayArea.mDisplayContent,
                false /* includingParents */);
    }
    
    //添加新創(chuàng)建的DisplayContent屏幕設(shè)備對象,將其存儲到父類屬性mChildren集合中
    void addChild(E child, int index) {
        if (!child.mReparenting && 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()
                    + "\n callers=" + Debug.getCallers(15, "\n"));
        }

        if ((index < 0 && index != POSITION_BOTTOM)
                || (index > mChildren.size() && index != POSITION_TOP)) {
            throw new IllegalArgumentException("addChild: invalid position=" + index
                    + ", children number=" + mChildren.size());
        }

        if (index == POSITION_TOP) {
            index = mChildren.size();
        } else if (index == POSITION_BOTTOM) {
            index = 0;
        }
		//將DisplayContent屏幕設(shè)備對象存儲到父類屬性mChildren集合中
        mChildren.add(index, child);

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

frameworks/base/services/core/java/com/android/server/wm/WindowContainer.java

class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<E>
        implements Comparable<WindowContainer>, Animatable, SurfaceFreezer.Freezable {
	protected final WindowList<E> mChildren = new WindowList<E>();
}

1)首先通過DisplayManager獲取當前存在的屏幕設(shè)備信息數(shù)組,然后遍歷該數(shù)組為每個屏幕設(shè)備創(chuàng)建對應(yīng)的DisplayContent對象實例。
2)調(diào)用addChild方法依次將創(chuàng)建的DisplayContent對象實例存儲到父類的mChildren集合中。

二、DisplayContent類定義

frameworks/base/services/core/java/com/android/server/wm/DisplayContent.java文章來源地址http://www.zghlxwxcb.cn/news/detail-467817.html

class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.DisplayContentInfo {

    /**
     * Create new {@link DisplayContent} instance, add itself to the root window container and
     * initialize direct children.
     * @param display May not be null.
     * @param root {@link RootWindowContainer}
     */
    DisplayContent(Display display, RootWindowContainer root) {
        super(root.mWindowManager, "DisplayContent", FEATURE_ROOT);
        if (mWmService.mRoot.getDisplayContent(display.getDisplayId()) != null) {
            throw new IllegalArgumentException("Display with ID=" + display.getDisplayId()
                    + " already exists="
                    + mWmService.mRoot.getDisplayContent(display.getDisplayId())
                    + " new=" + display);
        }

        mRootWindowContainer = root;
        mAtmService = mWmService.mAtmService;
        mDisplay = display;
        mDisplayId = display.getDisplayId();
        mCurrentUniqueDisplayId = display.getUniqueId();
        mOffTokenAcquirer = mRootWindowContainer.mDisplayOffTokenAcquirer;
        mWallpaperController = new WallpaperController(mWmService, this);
        display.getDisplayInfo(mDisplayInfo);
        display.getMetrics(mDisplayMetrics);
        mSystemGestureExclusionLimit = mWmService.mConstants.mSystemGestureExclusionLimitDp
                * mDisplayMetrics.densityDpi / DENSITY_DEFAULT;
        isDefaultDisplay = mDisplayId == DEFAULT_DISPLAY;
        mInsetsStateController = new InsetsStateController(this);
        mDisplayFrames = new DisplayFrames(mDisplayId, mInsetsStateController.getRawInsetsState(),
                mDisplayInfo, calculateDisplayCutoutForRotation(mDisplayInfo.rotation),
                calculateRoundedCornersForRotation(mDisplayInfo.rotation),
                calculatePrivacyIndicatorBoundsForRotation(mDisplayInfo.rotation));
        initializeDisplayBaseInfo();

        mAppTransition = new AppTransition(mWmService.mContext, mWmService, this);
        mAppTransition.registerListenerLocked(mWmService.mActivityManagerAppTransitionNotifier);
        mAppTransition.registerListenerLocked(mFixedRotationTransitionListener);
        mAppTransitionController = new AppTransitionController(mWmService, this);
        mUnknownAppVisibilityController = new UnknownAppVisibilityController(mWmService, this);

        final InputChannel inputChannel = mWmService.mInputManager.monitorInput(
                "PointerEventDispatcher" + mDisplayId, mDisplayId);
        mPointerEventDispatcher = new PointerEventDispatcher(inputChannel, this);

        // Tap Listeners are supported for:
        // 1. All physical displays (multi-display).
        // 2. VirtualDisplays on VR, AA (and everything else).
        mTapDetector = new TaskTapPointerEventListener(mWmService, this);
        registerPointerEventListener(mTapDetector);
        registerPointerEventListener(mWmService.mMousePositionTracker);
        if (mWmService.mAtmService.getRecentTasks() != null) {
            registerPointerEventListener(
                    mWmService.mAtmService.getRecentTasks().getInputListener());
        }

        mDisplayPolicy = new DisplayPolicy(mWmService, this);
        mDisplayRotation = new DisplayRotation(mWmService, this);
        mCloseToSquareMaxAspectRatio = mWmService.mContext.getResources().getFloat(
                com.android.internal.R.dimen.config_closeToSquareDisplayMaxAspectRatio);
        if (isDefaultDisplay) {
            // The policy may be invoked right after here, so it requires the necessary default
            // fields of this display content.
            mWmService.mPolicy.setDefaultDisplay(this);
        }
        if (mWmService.mDisplayReady) {
            mDisplayPolicy.onConfigurationChanged();
        }
        if (mWmService.mSystemReady) {
            mDisplayPolicy.systemReady();
        }
        mWindowCornerRadius = mDisplayPolicy.getWindowCornerRadius();
        mDividerControllerLocked = new DockedTaskDividerController(this);
        mPinnedTaskController = new PinnedTaskController(mWmService, this);

        final Transaction pendingTransaction = getPendingTransaction();
        configureSurfaces(pendingTransaction);
        pendingTransaction.apply();

        // Sets the display content for the children.
        onDisplayChanged(this);
        updateDisplayAreaOrganizers();

        mInputMonitor = new InputMonitor(mWmService, this);
        mInsetsPolicy = new InsetsPolicy(mInsetsStateController, this);

        if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Creating display=" + display);

        mWmService.mDisplayWindowSettings.applySettingsToDisplayLocked(this);
    }
}

到了這里,關(guān)于Android 12系統(tǒng)源碼_窗口管理(五)DisplayContent簡介的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 工程管理系統(tǒng)簡介 工程管理系統(tǒng)源碼 java工程管理系統(tǒng) 工程管理系統(tǒng)功能設(shè)計

    工程管理系統(tǒng)簡介 工程管理系統(tǒng)源碼 java工程管理系統(tǒng) 工程管理系統(tǒng)功能設(shè)計

    ?鴻鵠工程項目管理系統(tǒng) Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分離構(gòu)建工程項目管理系統(tǒng) 1. 項目背景 一、隨著公司的快速發(fā)展,企業(yè)人員和經(jīng)營規(guī)模不斷壯大。為了提高工程管理效率、減輕勞動強度、提高信息處理速度和準確性,公司對內(nèi)部工程管理的提升提出了更高

    2024年02月07日
    瀏覽(19)
  • 【Android 12】認識窗口

    【Android 12】認識窗口

    該文章為窗口層級結(jié)構(gòu)系列文章的總結(jié),重新回看這方面內(nèi)容的時候我自己也有了一些新的感悟,希望通過本次總結(jié)能讓大家再次對窗口有一個全面的認識。 一般來說,屏幕上最起碼包含三個窗口,StatusBar窗口、Activity窗口以及NavigationBar窗口: 我們想要了解窗口,可以按照

    2024年01月17日
    瀏覽(12)
  • Android 9系統(tǒng)源碼_音頻管理(一)按鍵音效源碼解析

    Android 9系統(tǒng)源碼_音頻管理(一)按鍵音效源碼解析

    當用戶點擊Android智能設(shè)備的按鈕的時候,如果伴隨有按鍵音效的話,會給用戶更好的交互體驗。本期我們將會結(jié)合Android系統(tǒng)源碼來具體分析一下控件是如何發(fā)出按鍵音效的。 1、在TV版的Android智能設(shè)備中,我們可以通過調(diào)節(jié)設(shè)置頁面的開關(guān)來控制按鍵音效的有無,該設(shè)置頁面

    2024年02月09日
    瀏覽(19)
  • Android12窗口模糊(一)在Activity和Dialog中實現(xiàn)高斯模糊效果

    Android12窗口模糊(一)在Activity和Dialog中實現(xiàn)高斯模糊效果

    在 Android 12 中,提供了一些用于實現(xiàn)窗口模糊處理效果(例如背景模糊處理和模糊處理后方屏幕)的公共 API。窗口模糊處理或跨窗口模糊處理用于模糊處理給定窗口后方的屏幕。 有兩種窗口模糊處理方式,可用于實現(xiàn)不同的視覺效果: 背景模糊處理(Background blur):可用于

    2023年04月19日
    瀏覽(26)
  • android源碼學習- APP啟動流程(android12源碼)

    android源碼學習- APP啟動流程(android12源碼)

    百度一搜能找到很多講APP啟動流程的,但是往往要么就是太老舊(還是基于android6去分析的),要么就是不全(往往只講了整個流程的一小部分)。所以我結(jié)合網(wǎng)上現(xiàn)有的文章,以及源碼的閱讀和調(diào)試,耗費了3整天的時間,力求寫出一篇最完整,最詳細,最通俗易懂的文章,

    2024年02月11日
    瀏覽(21)
  • AOSP 源碼編譯android 12

    AOSP 源碼編譯android 12

    目錄 一、python安裝? ? ? a. python2安裝 ? ? b. python3安裝 二、repo管理多個git ? ?a.第一步,? ?新建一個空白文件夾保存repo引導文件,并包含你的路徑 ? ?b.下載啟動器 ?c.將git-repo中的repo文件復制到 1 創(chuàng)建的.bin目錄中 ?d.修改權(quán)限 e. 執(zhí)行版本檢查 三、初始化工程 ? a.執(zhí)行創(chuàng)建文

    2024年01月16日
    瀏覽(27)
  • 【Linux驅(qū)動開發(fā)】編譯Android12源碼

    基于訊為電子rk3568教程 rk_android12.0_sdk_20220720.tar.gz 解壓 設(shè)置屏幕配置 整體編譯 Android 固件 使能編譯環(huán)境 開始整體編譯 rockdev/Image-rk3568_s // 編譯成功鏡像存放位置 單獨編譯u-boot (方法一) 編譯完成后在 u-boot 目錄會生成 rk356x_spl_loader_v1.13.112.bin 文件、uboot.img 文件、 resourc

    2024年02月05日
    瀏覽(23)
  • Activity啟動過程詳解(Android 12源碼分析)

    Activity啟動過程詳解(Android 12源碼分析)

    啟動一個Activity,通常有兩種情況,一種是在應(yīng)用內(nèi)部啟動Activity,另一種是Launcher啟動 1、應(yīng)用內(nèi)啟動 通過startActivity來啟動Activity 啟動流程: 一、Activity啟動的發(fā)起 二、Activity的管理——ATMS 三、線程切換即消息處理——mH 四、Activity啟動核心實現(xiàn)——初始化及生命周期 2、

    2024年02月13日
    瀏覽(26)
  • 【畢業(yè)設(shè)計/課程設(shè)計】基于android的訂餐系統(tǒng)設(shè)計與實現(xiàn)(源碼+文章) 含Web管理端 安卓外賣點餐

    【畢業(yè)設(shè)計/課程設(shè)計】基于android的訂餐系統(tǒng)設(shè)計與實現(xiàn)(源碼+文章) 含Web管理端 安卓外賣點餐

    1、數(shù)據(jù)庫:MySQL 2、開發(fā)工具 安卓端:android studio 管理后端:Idea、Eclipse、MyEclipse等Java開發(fā)工具均可 安卓端采用android studio工具開發(fā),管理后端采用Java語言,MySQL數(shù)據(jù)庫,開發(fā)框架是SpringBoot+VUE ? ? ? 利用網(wǎng)絡(luò)管理各行各業(yè)的業(yè)務(wù)操作已經(jīng)成為必然趨勢。菜品通過網(wǎng)絡(luò)進行銷

    2024年02月04日
    瀏覽(31)
  • 【Android12】Monkey壓力測試源碼執(zhí)行流程分析

    【Android12】Monkey壓力測試源碼執(zhí)行流程分析

    Monkey是Android提供的用于應(yīng)用程序自動化測試、壓力測試的測試工具。 其源碼路徑(Android12)位于 部署形式為Java Binary 通過Monkey,可以模擬用戶的Touch(單指、多指、手勢)、按鍵(key)事件等,檢測應(yīng)用程序發(fā)生的ANR、Crash事件,并收集相關(guān)Debug信息等。 例如測試應(yīng)用com.packa

    2024年03月22日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包