`
zzu_007
  • 浏览: 23747 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Activity的Window和WindowManager的创建过程(三)

阅读更多
page9
在这里我们分析一下DisplayManager的getDisplay函数的实现:
    1     public Display getDisplay(int displayId) {
    2             synchronized (mLock) {
    3                 return getOrCreateDisplayLocked(displayId, false /*assumeValid*/);
    4             }
    5     }
    第2行(DisplayManager->getDisplay)居然用一个锁, 不怕卡顿么?为什么要保护呢?
    第3行(DisplayManager->getDisplay)会调用getOrCreateDisplayLocked函数, getOrCreateDisplayLocked函数的定义如下:
    1     private Display getOrCreateDisplayLocked(int displayId, boolean assumeValid) {
    2         Display display = mDisplays.get(displayId);
    3         if (display == null) {
    4             display = mGlobal.getCompatibleDisplay(displayId,
    5                     mContext.getCompatibilityInfo(displayId));
    6             if (display != null) {
    7                 mDisplays.put(displayId, display);
    8             }
    9         } else if (!assumeValid && !display.isValid()) {
    10             display = null;
    11         }
    12         return display;
    13     }
    第2行(DisplayManager->getOrCreateDisplayLocked)会尝试在cache里获取.
    第4行(DisplayManager->getOrCreateDisplayLocked)会调用DisplayManagerGlobal的getCompatibleDisplay函数,
    其中传入的第二个参数通过调用ContextImpl的getCompatibilityInfo函数得到的, getCompatibilityInfo函数的定义如下:
        @Override
        public CompatibilityInfoHolder getCompatibilityInfo(int displayId) {
            return displayId == Display.DEFAULT_DISPLAY ? mPackageInfo.mCompatibilityInfo : null;
        }
    关于DisplayManagerGlobal的getCompatibleDisplay函数的详细分析可以参考page10文件.
    第12行(DisplayManager->getOrCreateDisplayLocked)返回该Display对象.
page10
DisplayManagerGlobal的getCompatibleDisplay函数的定义如下:
1     public Display getCompatibleDisplay(int displayId, CompatibilityInfoHolder cih) {
    2         DisplayInfo displayInfo = getDisplayInfo(displayId);
    3         if (displayInfo == null) {
    4             return null;
    5         }
    6         return new Display(this, displayId, displayInfo, cih);
    7     }
    第2行(DisplayManagerGlobal->getCompatibleDisplay)会调用getDisplayInfo函数来获得当前显示设备的DisplayInfo.
    getDisplayInfo函数的定义如下:
        public DisplayInfo getDisplayInfo(int displayId) {
            try {
                synchronized (mLock) {
                    DisplayInfo info;
                    if (USE_CACHE) {
                        info = mDisplayInfoCache.get(displayId);
                        if (info != null) {
                            return info;
                        }
                    }

                    info = mDm.getDisplayInfo(displayId);
                    if (info == null) {
                        return null;
                    }

                    if (USE_CACHE) {
                        mDisplayInfoCache.put(displayId, info);
                    }
                    registerCallbackIfNeededLocked();

                    if (DEBUG) {
                        Log.d(TAG, "getDisplayInfo: displayId=" + displayId + ", info=" + info);
                    }
                    return info;
                }
            } catch (RemoteException ex) {
                Log.e(TAG, "Could not get display information from display manager.", ex);
                return null;
            }
        }
    getDisplayInfo函数的主要逻辑就是通过DisplayManager服务通过Binder来获得DisplayInfo信息, 并返回该DisplayInfo对象.

    第6行(DisplayManagerGlobal->getCompatibleDisplay)会用刚刚得到的DisplayInfo对象构造一个Display, 我们来看看Display的构造函数是如何定义的:
        public Display(DisplayManagerGlobal global,
                int displayId, DisplayInfo displayInfo /*not null*/,
                CompatibilityInfoHolder compatibilityInfo) {
            mGlobal = global;
            mDisplayId = displayId;
            mDisplayInfo = displayInfo;
            mCompatibilityInfo = compatibilityInfo;
            mIsValid = true;

            // Cache properties that cannot change as long as the display is valid.
            mLayerStack = displayInfo.layerStack;
            mFlags = displayInfo.flags;
            mType = displayInfo.type;
            mAddress = displayInfo.address;
        }
    构造函数除了初始化成员变量之外, 什么也没做啊.
page11
这里我们分析一下PhoneWindow的setContainer函数的实现:
public final void setContainer(Window container) {
        super.setContainer(container);
    }
    因为PhoneWindow继承自Window, 所以会调用Window的setContainer函数, Window的setContainer函数的定义如下:
        public void setContainer(Window container) {
            mContainer = container;
            if (container != null) {
                // Embedded screens never have a title.
                mFeatures |= 1<<FEATURE_NO_TITLE;
                mLocalFeatures |= 1<<FEATURE_NO_TITLE;
                container.mHasChildren = true;
            }
        }
    Window的setContainer函数的主要逻辑就是将container的mHasChildren设置为true
分享到:
评论

相关推荐

    理解Window和WindowManager

    Window是一个抽象类,具体实现是 PhoneWindow 。不管是 Activity 、 Dialog 、 Toast 它们的视图都是附加在Window上的,因此Window实际上是View的直接管理者。

    window和windowManager1

    我们先来深入理解Window和WindowManager的相关知识点。 1. **WindowManager接口与实现**: Android提供了`WindowManager`接口,用于操作窗口。然而,真正实现`WindowManager`功能的是`WindowManagerGlobal`类,它...

    windowmanager

    Window和WindowManager之间的协作过程大致如下: 1. 当一个Activity启动时,系统会为该Activity创建一个默认的Window。这个Window通常是一个PhoneWindow,包含了DecorView,它是根ViewGroup,用于承载应用的布局。 ...

    深入理解Android中的Window和WindowManager

    创建一个Window,需要通过WindowManager即可完成,WindowManager是外界访问Window的入口,Window具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC的过程。Android中,所有...

    WindowManager弹窗

    1. **获取WindowManager实例**:通过Activity的`getWindowManager()`方法或者Context的`getSystemService(Context.WINDOW_SERVICE)`来获取WindowManager实例。 2. **定义布局文件**:创建XML布局文件,包含弹窗所需...

    Android悬浮框权限判断WindowManager

    - 使用`WindowManager`服务,通常在`Service`或`Activity`中初始化`WindowManager`实例:`WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);` - 创建一个`LayoutParam`对象,定义...

    Android利用WindowManager实现悬浮窗

    WindowManager继承了ViewManager接口,提供了三个方法来操作View:addView、updateViewLayout和removeView。 二、WindowManager参数设置 在使用WindowManager时,需要设置LayoutParams参数来确定窗口的大小、位置...

    Activity启动流程图

    Activity启动流程是Android系统中一个非常核心的部分,它是应用程序组件之一,负责创建和管理应用的用户界面。当我们想要启动一个新的Activity时,背后有一系列复杂的交互过程,涉及多个组件和类。本文将通过代码...

    随意调节你的activity的大小,activity 自定义窗口大小

    在Android系统中,WindowManager服务负责管理所有应用的窗口,而Activity实际上就是一种特殊的Window。默认情况下,Activity会全屏显示,但我们可以通过修改Activity的属性和使用自定义布局来改变这一行为。 1. ...

    Activity 工作过程1

    `attach`函数使得Activity能够访问到系统的各种服务,如`WINDOW_SERVICE`,从而能够创建和管理窗口。 在当前Activity中,`PhoneWindow`被实例化,它是Activity的窗口实现。`PhoneWindow`设置回调,然后通过`...

    android 采用windowmanager屏蔽home键

    首先,我们需要创建一个悬浮窗口(Floating Window),这是`WindowManager`的主要用途之一。悬浮窗口可以覆盖在其他应用之上,我们可以通过监听悬浮窗口的触摸事件来捕获Home键的按下情况。 1. **添加权限**:在...

    在当前Activity之上创建悬浮view之WindowManager悬浮窗效果

    最近有学生做毕业设计,想使用悬浮窗这种效果,其实很简单,我们可以通过系统服务WindowManager来实现此功能,本章我们来试验一下在当前Activity之上创建一个悬浮的view。 第一步:认识WindowManager 这个接口用于与 ...

    Android 利用WindowManager实现悬浮窗 demo

    本篇将深入探讨如何利用`WindowManager`来创建一个悬浮窗(Floating Window)的demo。 首先,悬浮窗的本质是在应用程序的主窗口之上添加一个额外的窗口。这种窗口通常具有较低的层级,以便它始终位于其他应用窗口之...

    Android悬浮窗实现 使用WindowManager Demo

    本教程将深入讲解如何使用`WindowManager`服务来创建和管理Android悬浮窗,并通过一个简单的Demo——WindowManagerDemo来展示其实现过程。 首先,我们要理解`WindowManager`是Android系统提供的一个接口,它允许...

    WindowManager.LayoutParams

    在Android开发过程中,`WindowManager.LayoutParams`是一个非常重要的类,它用于配置窗口的各种属性,如位置、大小、类型等。通过本文档,我们将深入探讨`WindowManager.LayoutParams`的所有参数及其详细信息。 ###...

    WindowManager.addView()实现悬浮窗口播放视频

    本文将深入探讨如何利用`WindowManager`服务和布局参数来创建这样的悬浮视频播放窗口。 首先,`WindowManager`是Android系统提供的一个接口,它允许我们添加、移除或更新视图到系统的窗口管理器中。`addView()`方法...

    Android 悬浮Activity ( Dialog风格)

    在Android中实现悬浮Activity,首先需要创建一个新的Activity,并在布局文件中设置其样式为Dialog样式。这可以通过修改`&lt;style&gt;`标签中的`parent`属性为`Theme.AppCompat.Dialog`来实现。同时,为了使Activity浮现在...

    WindowManager实现悬浮窗口&可自由移动的悬浮窗口

    总结,创建一个`WindowManager`实现的悬浮窗口,关键在于设置正确的`LayoutParams`,包括类型、标志和初始位置。同时,通过监听触摸事件,可以实现窗口的自由移动。这个示例中的`FloatViewDemo`应该包含上述代码的...

    android启动以及activity生命周期分析

    - **PhoneWindow**: 创建PhoneWindow的过程实际上就是在Activity内部创建一个`PhoneWindow`实例。这个过程会涉及到一些窗口的初始化工作,比如设置布局和添加装饰视图。 #### setContentView `setContentView`是...

Global site tag (gtag.js) - Google Analytics