Window的属性
Window的属性,常用的选项:
FLAG_NOT_FOCUSABLE
Window不需要获取焦点,也不需要接收各种输入事件(收不到Back键的事件),此标记会同时启用FLAG_NOT_TOUCH_MODEAL,最终事件会直接传递给下层的具有焦点的Window。
FLAG_NOT_TOUCH_MODEAL
收不到触屏事件,不会拦截其他Window的单击事件,一般情况下都需要开启
FLAG_SHOW_WHEN_LOCKED
可让Window显示在锁屏的界面上
版本变动
在Android众多版本的迭代中,其实悬浮窗也有比较多的变化,所以我们在使用中还要针对情况来进行相应的适配。在5.1之前,大多数手机系统里只有声明了<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>权限有就可以在app中弹出悬浮窗,除了国内部分厂商手机如:小米、魅族等定制系统中处理了悬浮窗权限要开关。我们日常开发中,比较常用到的类型有:
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY
没有实体,不会响应事件,无法进行交互,但可悬浮在锁屏面板
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
可以接收事件
WindowManager.LayoutParams.TYPE_TOAST
在4.4以下无法接收事件,在4.4到7.0以下可以不加权限声明也能弹出悬浮窗在应用之上,在7.0及以上系统填补了不加权限声明的漏洞,在8.0中不能常显示,像正常Toast一样有显示的时间限制
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
8.0上指定开发者使用悬浮窗唯一的类型,其它类型都会报崩溃
PS
想要在应用内显示在所以Activity之上设置type=TYPE_APPLICATION
如果传入的Context(必须是Activity) 不是当前Active的Activity也是不能正常show出来的。现在比较好的方案是在基类Activity中处理需要展示同一业务的Window
demo
mWm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
Context context = activity;
mWindowView = View.inflate(context, R.layout.xxx, null);
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.type = WindowManager.LayoutParams.TYPE_APPLICATION;
params.format = PixelFormat.TRANSLUCENT;
mWm.addView(mWindowView, params);