一、简介
Window 是一个抽象类,它的具体实现是 PhoneWindow
类。WindowManager 是外界访问 Window 的入口,Window 的具体实现是在 WindowManagerService(系统服务) 中,WindowManager 和 WindowManagerService 的交互是一个 IPC 过程。
Android 所有的视图都是通过 Window 呈现的,包括 Activity、Dialog、Toast,它们的视图实际上都是附加在 Window 上,所以 Window 实际是 View 的直接管理者。
二、简单添加一个 Window
show my code
mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
mFloatingButton = new Button(this);
mFloatingButton.setText("click me");
mLayoutParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, 1, 0,
PixelFormat.TRANSPARENT);
mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL //当前Window区域以外的单击事件传递给底层Window,区域以内的交给自己处理
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE //不需要获取焦点,不接收各种输入事件
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; // 显示在锁屏界面上
mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP;
mLayoutParams.x = 100;
mLayoutParams.y = 300;
mFloatingButton.setOnTouchListener(this);
//添加 View
mWindowManager.addView(mFloatingButton, mLayoutParams);
下面介绍一下 WindowManager.LayoutParams
的 Flag 和 Type :
Flag 控制 Window 的显示特性
-
FLAG_NOT_TOUCH_MODAL
表示系统将当前 Window 区域以外的单击事件传递给底层 Window,当前 Window 以内的单击事件自己处理。
-
FLAG_NOT_FOCUSABLE
表示 Window 不需要获取焦点,也不接收任何输入事件,会启用上面的 Flag,最终事件会直接传递给下层具有焦点的 Window。
-
FLAG_SHOW_WHEN_LOCK
开启此模式可以让 Window 显示在锁屏界面上。
Type 参数表示 Window 的类型
-
应用 Window
对应着一个 Activity
-
子 Window
不能单独存在,需要附属到特定的父 Window。如 Dialog
-
系统 Window
需要声明权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
才能创建,如 Toast,系统状态栏