【问题标题】:What is an Android window?什么是安卓窗口?
【发布时间】:2012-02-26 08:52:35
【问题描述】:

什么是 Android 中的Window

我以为 Android 中最顶层的级别叫做Activity,也就是你看到的屏幕。

谁能告诉我 Android 中的 Window 是什么?我们只有一个还是多个。

【问题讨论】:

    标签: android android-activity android-window


    【解决方案1】:

    [更新](让我分享一下我在原始答案后对Window 的了解)

    一句话,A Window 是一个矩形区域,只有一个视图层次。下图中的彩色矩形是窗口。

    如您所见,一个屏幕中可以有多个窗口,由WindowManager 管理它们。当前画面的窗口列表可以通过Hierarchy Vieweradb shell dumpsys window获取。

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

    (以下为原答案)


    我也有同样的问题,希望对大家有所帮助。

    根据Android Developer Documentation

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

    还有,Android 框架工程师Dianne Hackborn 给出了一些定义here。她说,

    一个窗口基本上就像你想象的桌面上的一个窗口。它有一个Surface,在其中呈现窗口的内容。应用程序与窗口管理器交互以创建窗口; Window Manager 为每个窗口创建一个 Surface 并将其提供给应用程序进行绘图。应用程序可以在 Surface 中绘制它想要的任何东西;对于窗口管理器,它只是一个不透明的矩形。

    Surface 是一个对象保存正在合成到屏幕上的像素。你在屏幕上看到的每个窗口(一个对话框、你的全屏活动、状态栏)都有它自己绘制的表面,Surface Flinger 以正确的 Z 顺序将它们渲染到最终显示。一个表面通常有多个缓冲区(通常是两个)来进行双缓冲渲染:应用程序可以绘制它的下一个 UI 状态,而表面抛掷器正在使用最后一个缓冲区合成屏幕,而无需等待应用程序完成绘图。

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

    另外,我从Romain Guy的演讲中找到了一些其他信息(您可以在here观看他在旧金山Android用户组的演讲,并从here下载完整幻灯片)

    所以,简而言之:

    • Activity 有一个窗口(在其中绘制其用户界面),
    • Window 有一个 Surface 和一个附加的视图层次结构,
    • Surface 包括 ViewGroup,它拥有视图。

    【讨论】:

    • 感谢您的精彩回答和链接。有人可以告诉我 decorView 在这个解释中的位置吗?
    • 你能告诉我为什么 view.getLocationInWindow() 返回 y 坐标,因此它也包含状态栏高度。状态栏应该在另一个窗口中。另外,我检查了我所说的窗口是一个活动窗口。
    • 根据您的活动主题、系统 ui 标志等,它可能位于状态栏下方(因此状态栏的高度不包含在窗口中),也可能位于状态后面栏(以便您的活动可以在透明状态栏后面绘制,在这种情况下,状态栏高度包含在窗口中)。特别是,如果您使用的是自定义状态栏颜色,那么您就是在状态栏后面绘制。
    【解决方案2】:

    我想简单说一下:

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

    【讨论】:

    • 感谢 Finwe 提供更好的格式。坦率地说,我对 stackoverflow 完全陌生。
    【解决方案3】:

    以下是关于 Window、Surface、Canvas 和 Bitmap 之间如何发生交互的非常基本且简单的概念概述。

    【讨论】:

    • 用状态和导航栏对应图表中的上下Surfaces?
    • 屏幕上的每个窗口都有一个表面。屏幕上可以有多个窗口。是的,导航和状态栏有它们相关的窗口和附加的表面。上图只是概念的示例说明。
    【解决方案4】:

    Activity 就是你所说的窗口。

    从技术上讲,Activity 会为您创建 Window。

    你可以有很多,但通常不是同步的。要询问更多信息,您可以调用 Dialog,或向另一个 Activity 触发 Intent。

    欲了解更多信息visit this link

    【讨论】:

    • 有activity.getWindow(),所以window是Activity的一部分。
    • 感谢 Knossos 提供的信息丰富且简单的回答。
    • 也感谢 Zon 提供此活动属性。
    猜你喜欢
    • 2011-12-26
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多