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 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,637评论 25 708
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,567评论 0 17
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,001评论 19 139
  • 工作日早上的地铁,永远有很长的队列需要排,但是幸好我是住在地铁某条线的首发站,排队的人并不算特别多。 那一站地铁有...
    栗子酱举个栗子阅读 744评论 0 0
  • 那一年。 三月春风吹暖那片小村庄, 他认识了她 。 她野百合一般的性子, 不拘束、随性有点小任性。 她名字-...
    丨雪色丶咖啡茶阅读 199评论 0 0