窗口的创建过程

来源:互联网 发布:网络阅读缺点 编辑:程序博客网 时间:2024/05/17 04:59
 摘自:柯元旦 《Android内核剖析》
创建窗口的过程
  从WmS的角度来看,一个窗口并不是Window类,而是一个View类。WmS收到用户消息后,需要把消息派发到窗口,View类本身并不能直接接收WmS传递过来的消息,真正接收用户消息的必须是IWindow类,而实现IWindow类的是ViewRoot.W类,每一个W内部都包含一个View变量。
  WmS并不介意该窗口(View)是属于哪个应用程序的,WmS会按一定的规则判断哪个窗口处于少去状态,然后把用户消息发送给W类,W类再把用户消息传递给内部的View变量,剩下的消息处理就由View对象完成。
1. 窗口的类型
  Framework定义了三种窗口类型,三种类型的定义在WindowManager类中。
1> 第一种为应用窗口。所谓应用窗口一般是指该窗口对应一个Activity,由于加载Activity是由AmS完成的,因此,对于应用程序来讲,要创建一个应用类窗口,只能在Activity内部完成。
2> 第二种是子窗口。所谓子窗口是指该窗口必须有一个父窗口,父窗口可以是一个应用类型窗口,也可以是任何其他类型的窗口。
3> 第三种是系统窗口。系统窗口不需要对应任何Activity,也不需要有父窗口。对应用程序而言,理论上是无法创建系统窗口的,因为所有的应用程序都有这个权限,然而系统进程却可以创建系统窗口。
   WindowManager类对三种类型进行了细化,把每一种类型都用一个int值表示,这实际上代表了窗口对应的层(Layer)。WmS在进行窗口叠加时,会按照该int值的大小分配不同层,int值越大,代表层的位置越靠上面,即所谓的z-order.
    由于有些系统窗口只能出现一个,即不能添加多个,否则用户会觉得很乱,比如输入法窗口,再比如系统状态条窗口,因此,WmS在接收到创建窗口的消息时,会进行一定的检查,确保该窗口只能被创建一次。
2. 创建应用窗口
   创建应用窗口,其实就是创建Activity。
   书中内容太多,就不摘录了。
3. 创建子窗口
 子窗口分别包括:Dialog、PopupWindow、ContexMenu、OptionMenu
1》Dialog
  Dialog创建了内部的Window对象后,接下来,当应用程序调用 show()方法时,该Dialog就会显示到屏幕上。然而,在调用show()方法之前,Dialog内部仅仅是创建了一个Window对象,而并没有告知WmS添加一个可以显示的窗口。因此show()方法中必须实现向WmS中添加一个真正的可以显示的窗口,而不仅仅是Window对象。
 在应用程序中实现Dialog,可以查看这篇文章:《老罗Android》学习之对话框

2》PopupWindow
  弹出窗口(PopupWindow)是Framework提供的一种UI控件,比如那种下拉列表就是一个PopupWindow,AutoText控件也是基于PopupWindow实现。 PopupWindow并不是继承于Window类,所以,该类本身并不是一个窗口类。
  PopupWinodw的操作,可以查看这篇文章:Android-自定义PopupWindow

3》ContextMenu
 情景菜单(ContextMenu)一般是长按ListView的某个Item时弹出的菜单,程序也可以给任意一个View设置情景菜单 ,并且启动的方式不一定是长按,可以是任意消息组合,比如双击、单击、滑动等。
  情景菜单实际上是一个Dialog,所不同的是,情景菜单把创建好了的Dialog添加到WmS时,会修改该Dialog窗口的类型,即从默认的应用类型改为子窗口类型。
1.触发情景菜单的消息
  显示情景菜单一般有两种方式,第一种是当用户长按某个View时,如果该View已经添加过情景菜单,则会弹出一个情景菜单窗口;另一种是程序员调用openContexMenu()方法。
为什么长按时会触发情景菜单呢?因为在View类的performLongClick()方法中代码如下:
 handled=mOnLongClickListener.onLongClick(View.this);
 if(handled){
    handled=showContextMenu();
 }
即首先执行长按的回调函数,如果用户没有处理该消息,则调用showContextMenu()方法,这就启动了显示情景菜单的流程。

4》OptionMenu
 选项菜单(OptionMenu)一般是指用户按下"Menu"键后弹出的菜单。
 菜单的操作,可以查看这篇文章:《老罗Android》学习 Menu菜单


4.系统窗口Toast的创建
 系统窗口的含义有两个方面:
1)系统窗口不依赖于应用,而应用类窗口都必须有一个应用Activity与之对应。
2)系统窗口是由系统创建的,应用程序没有权限创建。但有三个系统窗口例外,这三个系统窗口分别为TYPE_TOAST、TYPE_INPUT_METHOD、TYPE_WALLPAPTER。






0 0
原创粉丝点击