Window的具体实现是PhoneWindow,创建一个Window只需要通过WindowManager即可,Window是外界访问Window的入口,Window的具体实现位于WindowManagerService中,WindowManager和WindowManagerService的交互式一个IPC过程。Android中所有的视图都是视图通过Window来呈现的,(Activity,Dialog,Toast)
WindowManager.LayoutParams中的flags和type,这两个参数说明
FLAG_NOT_FOCUSABLE 表示Window不需要获取焦点,也不需要接收各种输入事件,此标记会同时启用FLAG_NOT_TOUCH_MODEL,最终事件会直接传递给下层件包邮焦点的Window
FLAG_NOT_TOUCH_MODEL 系统会将当前Window区域以外的单击事件传递给底层的Window,当前Window区域以内的单击事件则会自己处理,一般来说需要开启次标记,否则其他Window将会无法收到单击事件
FLAG_SHOW_WHEN_LOCKED 开启此模式可以让Window显示在锁屏界面上
type表示参数类型,Window有三种类型,应用Window,子Window和系统Window,应用类Window对应着一个Activity,子Window不能单独存在,他需要附属在特定的父Window之中(Dialog),系统Window是需要声明权限在能创建的Window(Toast)。
Window是分层的,每个Window都对应的z-ordered,层级大的会覆盖在层级小的Window上面,应用Window的层级范围是1~99,子Window的层级范围是99~1999,系统Window的层级范围是2000~2999,这些层级范围对应着WindowManager.LayoutParams的type参数,如果想让Window位于所有Window的最顶层,那么采用较大层级即可,系统层级的值有很多,一般选用TYPE_SYSTEM_ERROR或者TYPE_SYSTEM_OVERLAY,如果使用TYPE_SYSTEM_ERROR,只需要为type参数指定层级即可,mLayoutParams.type = LayoutParams.TYPE_SYSTEM_ERROR,同时尚明权限<user-permission android:name = "android.permission.SYSTEM_ALERT_WINDOW"/>
Window是一个抽象的概念,每个Window都对应一个View和一个ViewRootImpl,Window和View 通过ViewRootImpl建立连接,因此Window并不是实际存在的,他是以View的形式存在的
普通Dialog必须采用Activity的Context,如果采用Application的Context,那么就会报错