窗口的创建过程
2014-09-08 10:51
253 查看
摘自:柯元旦 《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。
创建窗口的过程
从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。
相关文章推荐
- vc++窗口的创建过程
- MFC应用程序中处理消息的顺序 MFC应用程序创建窗口的过程 关闭窗口的顺序(非模态窗口) ..................
- 创建窗口过程中要调用一次窗口过程函数
- 有谁知道Delphi中"窗口"的创建过程?
- vc++窗口的创建过程(MFC消息机制的经典文章)
- 总结创建窗口全过程
- MFC应用程序中处理消息的顺序,创建窗口的过程关闭窗口的顺序(非模态窗口),打开模式对话框的函数调用顺序
- 有谁知道Delphi中"窗口"的创建过程?
- 窗口创建和销毁过程
- Win32创建窗口的过程
- MFC应用程序创建窗口的过程
- MFC程序对win32的封装总结(窗口类的注册,窗口的创建,窗口的窗口过程指定)
- MFC应用程序创建窗口的过程
- MFC应用程序创建窗口的过程
- MFC基于对话框 创建工具栏 工具栏提示 窗口同步缩放 拦截主界面Enter按下 窗口过程 菜单工具栏按钮变灰
- MFC程序对win32的封装总结(窗口类的注册,窗口的创建,窗口的窗口过程指定)
- MFC应用程序中处理消息的顺序,创建窗口的过程关闭窗口的顺序(非模态窗口),打开模式对话框的函数调用顺序
- PLSQL Developer图形化窗口创建数据库全过程
- MFC应用程序中处理消息,创建窗口的过程,关闭窗口(非模态窗口),打开模式对话框等的函数调用顺序 .
- MFC应用程序消息处理及其窗口创建和销毁过程函数调用顺序