android开发window和windowmanager

来源:互联网 发布:网络数据包截获 转发 编辑:程序博客网 时间:2024/05/29 09:58

Window是一个抽象类,具体实现是PhoneWindow。创建一个Window只需要通过WindowManager即可WindowManager是外界访问Window的入口,Window的具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互是一个IPC过程。Android中的所有试图都是通过Window呈现的。无论是Activity、Dialog、Toast,他们的视图实际上都是附加在Window上的,因此Window实际是View直接管理者。

Flags参数表示Window的属性,通过这些选项可以控制Window的显示特性。

Window有三种类型,分别是应用Window、子Window和系统Window,应用类Window对应着一个Activity。子Window不能单独存在,它需要附属在特定的父Window之上,比如常见的一些Dialog就是一个字Window。系统Window是需要特定声明权限才能够创建的Window,比如Toast和系统状态栏这些都是系统Window。

Window会有层的概念,层级大的会覆盖在层级小得Window上面。在三类Window中,应用层Window的层级范围是1-99,字Window的层级范围是1000-1999,系统Window的层级范围是2000-2999,因此系统Window会覆盖子Window,应用层Window优先级最低,层级范围对应WindowManager.LayoutParams的type参数。

系统级Window所需要的权限为SYSTEM_ALERT_WINDOW

Window继承与ViewManager,其中有三个重要的方法:addView,updateViewLayout,removeView

Window是一个抽象的概念,每一个Window都对应着一个View和ViewRootImpl,Window和View是通过ViewRootImp联系起来的,因此Window并不是真实存在的他是以View的形式存在的,这一点从WindowManager的定义也可以看出,他提供的三个接口方法addView、updateViewLayout和removeView都是直接针对View的,这说明View才是Window存在的实体。

Window的添加过程需要通过WindowManager的addView实现,WindowManager是一个接口,他的真正实现是WindowManagerImpl。而在WindowManagerImpl内部并没有真正实现Window的三大操作,而是全部交给了WindowManagerGlobal,WindowManagerGlobal以工厂的形式向外提供自己的实例。WindowManager这种工作模式是典型的桥接模式,将所有操锁全部委托给WindowManagerGlobal来来实现。

View的最终绘制过程是由ViewRootImpl的setView内部调用requestLayout来完成的。

View是Android中的视图呈现方式,但是View不能单独存在,他必须依附在Window上,因此有视图的地方就有Window。因此Android中的Activity、Dialog、Toast等视图都对应着一个Window。

Activity的启动最终是会由ActivityThread中的performLaunchActivity来完成整个启动过程,在这个方法内部会通过类加载器去创建Activity的实例,并调用attach方法为其关联运行过程中所依赖的上下文环境变量。

Toast基于Window实现,但是由于Toast具有定时取消这一功能,所以系统采用了Handler。Toast属于系统Window。

Taost的显示和隐藏实际上是通过Toast中的TN这个类来实现的,他有两个方法show和hide,分别对应Toast的显示和隐藏,由于这两个方法是被NMS以跨进程的方式调运的,因此他们运行在Binder线程池中。为了将执行环境切换到Toast所在的线程,在他们的内部使用了Handler.

原创粉丝点击