android开发window和windowmanager
2017-12-03 23:01
169 查看
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.
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.
相关文章推荐
- 《Android 开发艺术探索》笔记——(8)Window 和 WindowManager
- Android开发——带你彻底理解 Window 和 WindowManager
- Android开发艺术探索——第八章:理解Window和WindowManager
- android艺术开发探索之window和windowmanager
- android应用开发之Window,View和WindowManager .
- 读书笔记-Android开发艺术探索-第8章-理解Window和WindowManager
- 第八章理解Window和WindowManager(Android开发艺术探索)
- 利用Window和WindowManager实现悬浮窗效果——Android开发艺术探索笔记
- android开发中遇到的android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.
- android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@3
- E/WindowManager: android.view.WindowLeaked: Activity com.xxx.xxx.xxx has leaked window com.android.i
- android开发之popupwindow的使用及细节
- android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is yo
- Android 开发之漫漫长途 Ⅲ—Activity 的显示之 Window和View(2)
- Android开发环境搭建-Window系统
- Android 魅族开发Window悬浮窗口没有获取到焦点
- android.view.WindowManager$BadTokenException: Unable to add window --Unabletoaddwindow--tokenandroid
- android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an appli
- android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@1ccfe
- android中Activity中的WindowManager与Window