Android入门之窗口类型

时间:2021-02-07 17:01:10

        从WmS的角度看,一个窗口并不是Window类,而是一个View类。WmS收到用户消息后,需要把消息派发到窗口,View类本身并不能直接接收WmS传递过来的消息,真正接收用户消息的必须是IWindow类,而实现IWindow类的是ViewRoot.W类,每一个W内部都包含了一个View变量。

        WmS并不介意该窗口(View)是属于哪个应用程序的,WmS会按一定的规则判断哪个窗口处于活动状态,然后把用户消息给W类,W类再把用户消息传递给内部的View变量,剩下的消息处理就由View对象完成。

        Framework定义了三种窗口类型,三种类型的定义在WindowManager的LayoutParams中。

        第一种窗口类型为应用窗口,所谓的应用窗口是指该窗口对应一个Activity,由于加载Activity是由AmS完成的,因此,对于应用程序来说,要创建一个应用类窗口,只能在Activity内部完成。

        应用窗口包含以下几类:

                                    定义                                                                       意义
FIRST_APPLICATION_WINDOW = 1 第一个普通应用窗口
TYPE_BASE_APPLICATION = 1 基窗口,所有其他类型的应用窗口将出现在基窗口上层
TYPE_APPLICATION = 2 普通应用窗口
TYPE_APPLICATION_STARTING = 3 应用程序启动时先显示此窗口,当真正的窗口配置完成后,此窗口被关闭
LAST_APPLICATION_WINDOW = 99 最后一个应用窗口

        所有Activity默认的窗口类型都是TYPE_APPLICATION,WmS在进行窗口叠加时,会动态改变应用窗口的层值,但层值不会大于99。

        第二种窗口类型是子窗口,子窗口是指该窗口必须要有一个父窗口,父窗口可以是一个应用类型窗口,也可以是任何其他类型的窗口。

        子窗口包含以下几类:

                                    定义                                                             意义
FIRST_SUB_WINDOW = 1000 第一个子窗口
TYPE_APPLICATION_PANEL = FIRST_SUB_WINDOW 应用窗口的子窗口,PopupWindow的默认类型
TYPE_APPLICATION_MEDIA = FIRST_SUB_WINDOW + 1 用来显示Media的窗口
TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW + 2 TYPE_APPLICATION_PANEL的子窗口
TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW + 3 OptionMenu、ContextMenu的默认类型
TYPE_APPLICATION_MEDIA_OVERLAY = FIRST_SUB_WINDOW + 4 TYPE_APPLICATION_MEDIA的重影窗口,显示在TYPE_APPLICATION_MEDIA和应用窗口之间
LAST_SUB_WINDOW = 1999 最后一个子窗口

        创建子窗口时,客户端可以指定窗口类型介于1000-1999之间,而WmS在进行窗口叠加时,会动态调整层值。


        第三种窗口类型是系统窗口,系统窗口不需要对应任何Activity,也不需要有父窗口,对于应用程序而言,理论上是无法创建系统窗口的,因为所有的应用程序都没有这个权限,然而系统进程却可以创建系统窗口。

        系统窗口有以下类型:

                                                                定义                                     意义
FIRST_SYSTEM_WINDOW = 2000 第一个系统窗口
TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW 状态栏窗口
TYPE_SEARCH_BAR = FIRST_SYSTEM_WINDOW +1 搜索条窗口
TYPE_PHONE = FIRST_SYSTEM_WINDOW + 2 来电显示窗口
TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW + 3 警告对话框
TYPE_KEYGUARD = FIRST_SYSTEM_WINDOW + 4 屏保
TYPE_TOAST = FIRST_SYSTEM_WINDOW + 5 Toast对应的窗口
TYPE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW + 6 系统覆盖窗口,需要显示在所有窗口之上
TYPE_PRIORITY_PHONE = FIRST_SYSTEM_WINDOW + 7 在屏幕保护下的来电显示窗口
TYPE_SYSTEM_DIALOG = FIRST_SYSTEM_WINDOW + 8 滑动状态条后出现的窗口
TYPE_KEYGUARD_DIALOG = FIRST_SYSTEM_WINDOW + 9 屏保弹出的对话框
TYPE_SYSTEM_ERROR = FIRST_SYSTEM_WINDOW + 10 系统错误窗口
TYPE_INPUT_METHOD = FIRST_SYSTEM_WINDOW + 11 输入法窗口
TYPE_INPUT_METHOD_DIALOG = FIRST_SYSTEM_WINDOW + 12 输入法中备选框对应的窗口
TYPE_WALLPAPER = FIRST_SYSTEM_WINDOW + 13 墙纸对应的窗口
TYPE_STATUS_BAR_PANEL = FIRST_SYSTEM_WINDOW + 14 滑动状态条后出现的窗口
TYPE_SECURE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW + 15 安全系统覆盖窗口,显示在所有窗口之上。
LAST_SYSTEM_WINDOW = 2999 最后一个系统窗口