什么是Android窗口?

什么是Android窗口?,android,android-activity,android-window,Android,Android Activity,Android Window,Android中的窗口是什么 我认为安卓系统的最高级别叫做活动,这就是你看到的屏幕 有人能告诉我Android中的窗口是什么吗?我们是否只有一个或多个窗口。该活动就是您所说的窗口 从技术上讲,该活动为您创建了一个窗口 你可以有很多,但通常不是同步的。要询问其他信息,您可以调用对话框,或激发另一个活动的意图 更多信息。[UPDATE](在原始答案之后,让我分享一下我对窗口的了解) 在一句话中,窗口是一个具有一个视图层次结构的矩形区域。下图中的彩色矩形是窗口 如您所见,在一个屏幕中可以有多个窗口,

Android中的
窗口是什么

我认为安卓系统的最高级别叫做
活动
,这就是你看到的屏幕


有人能告诉我Android中的窗口是什么吗?我们是否只有一个或多个窗口。

该活动就是您所说的窗口

从技术上讲,该活动为您创建了一个窗口

你可以有很多,但通常不是同步的。要询问其他信息,您可以调用对话框,或激发另一个活动的意图

更多信息。

[UPDATE](在原始答案之后,让我分享一下我对
窗口的了解)

在一句话中,窗口是一个具有一个视图层次结构的矩形区域。下图中的彩色矩形是窗口

如您所见,在一个屏幕中可以有多个窗口,并对其进行管理。当前屏幕中的窗口列表可通过或
adb shell dumpsys窗口
获取

层次结构查看器中的窗口列表示例:

(以下是原始答案)


我也有同样的问题,我希望这能帮助你们

根据,

“每个活动都有一个窗口,可以在其中绘制其用户界面。”

作为Android框架工程师,他给出了一些定义。她说,

窗口基本上就像你想象的桌面上的窗口一样。它有一个单独的曲面,其中渲染窗口的内容。应用程序与窗口管理器交互以创建窗口;窗口管理器为每个窗口创建一个曲面,并将其提供给绘图应用程序。应用程序可以在表面上绘制任何它想要的东西;对于窗口管理器来说,它只是一个不透明的矩形

曲面是一个对象,包含合成到屏幕上的像素。您在屏幕上看到的每个窗口(对话框、全屏活动、状态栏)都有自己的绘制到的曲面,surface Flinger以正确的Z顺序将其渲染到最终显示。一个曲面通常有多个缓冲区(通常是两个)来进行双缓冲渲染:当surface flinger使用最后一个缓冲区合成屏幕时,应用程序可以绘制其下一个UI状态,而无需等待应用程序完成绘制

视图是窗口内的交互式UI元素一个窗口附加了一个视图层次,它提供了窗口的所有行为每当需要重新绘制窗口时(例如因为视图本身已失效),都会在窗口的曲面中进行此操作。曲面已锁定,这将返回可用于绘制到其中的画布。绘制遍历在层次结构中完成,为每个视图向下传递画布以绘制其UI部分。完成后,曲面将解锁并发布,以便将刚绘制的缓冲区交换到前景,然后由曲面Flinger合成到屏幕上

另外,我从演示文稿中发现了一些其他信息(你可以在旧金山Android用户组观看他的演讲,从下载完整的幻灯片)

因此,简而言之:

  • 活动
    有一个窗口(在其中绘制其用户界面)
  • 窗口
    有一个
    曲面
    和一个附加的视图层次
  • 一个包含视图的
    曲面
    包含
    视图组

下面是一个非常基本和简单的概念性概述,介绍了窗口、曲面、画布和位图之间如何进行交互。

我想简单地说:

Application --->
  Activity --->
    Window Manager --->
      Window --->
        Surface ---> 
          Canvas --->
            View Root ---> 
              View Group --->
                View ---> 
                  Bitmap/Open GL panel ---> 
                    Current Surface Buffer ---> 
                      Surface Flinger --->
                        Screen

将图表中的上下表面与状态和导航栏相对应?屏幕上的每个窗口都有一个表面。屏幕上可以有多个窗口。是的,导航栏和状态栏具有关联的窗口和附着的曲面。上面的图片只是这个概念的一个示例说明。感谢亲爱的Finwe提供了更好的格式。坦率地说,我对stackoverflow一无所知。感谢您的精彩回答和链接。有人能告诉我decorView在这个解释中的位置吗?你能告诉我为什么view.getLocationInWindow()返回y坐标,这样它也包含状态栏高度。状态栏应该位于另一个窗口中。此外,我已经检查了我所说的窗口是否是活动窗口。根据活动的主题、系统ui标志等,它可能位于状态栏下方(因此状态栏的高度不包括在窗口中),也可能位于状态栏后面(这样,您的活动可以在透明状态栏后面绘制,在这种情况下,状态栏的高度包含在窗口中)。特别是,如果您使用自定义状态栏颜色,则您可以在状态栏后面绘制。有activity.getWindow(),所以窗口是活动的一部分。感谢Knossos提供了这一内容丰富且简单的答案。也感谢Zon提供此活动属性。