Android悬浮窗DEMO和碰到的坑

一、悬浮窗原理

应用使用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...................

你可能感兴趣的:(Android悬浮窗DEMO和碰到的坑)