从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 | 最后一个系统窗口 |