一、悬浮窗原理
应用使用Context上下文获取WINDOW_SERVICE获取WindowManager
通过调用addView()
removeView()
两个方法来显示和移除View
WindowManager mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
需要注意这里的Context上下文,在绝大多数非原生系统上,context上下文会影响悬浮窗的显示范围。
在MIUI和华为等国产系统上,使用Activity的Context只能显示在Activity里,一旦后台就看不见了。
所以你的悬浮窗需要后台显示,就一定要使用getApplicationContext()
。
二、添加一个悬浮窗
WindowManager.LayoutParams mWindowParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_TOAST,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.RGBA_8888);
if (Build.VERSION.SDK_INT < 19 ) {
mWindowParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}
mWindowManager.addView(view,mWindowParams );
public LayoutParams(int w, int h, int _type, int _flags, int _format)
当你需要一个后台悬浮窗时,
_type
这个参数得注意和了解一下,推荐使用TYPE_TOAST
TYPE_TOAST
:
优点
: 无需开启悬浮窗权限,缺点
:API < 19 时无法处理触控操作TYPE_SYSTEM_ALERT
:
缺点
需要开启悬浮窗权限
当然还有其他的_type,根据自己的需求去使用对应的类型
三、移除一个悬浮窗
removeView...................