悬浮窗原理
思路:
1.建立一个服务,并且在里面生成一个WindowManager对象,通过它来加载一个视图作为悬浮窗。
2.设置WindowManager的参数LayoutParams
3.设置一个容器来找到悬浮窗的父控件,并绑定到windowManager中去
4.通过父控件来加载悬浮窗的视图
这个思路需要注意的两个细节:
a. WindowManager的参数LayoutParams中的type字段,目前主流的做法是将改字段赋值为LayoutParams.TYPE_PHONE.
b. 需要在AndroidManifest中加上相应的权限
否则无法出现悬浮窗。
上面省略的布局文件的说明,详情可以参考代码部分。
到这里,如果运气好的话,你很容易就可以用代码实现一个悬浮窗,再复杂一点的还可以顺便实现拖动效果,然而现实总是很残酷的,由于安卓系统的碎片化现象太严重,各家ROM对这个悬浮窗做了各种限制,比如小米的miui、魅族和锤子等只有用户进入到应用设置页面,打开悬浮窗开关才能显示悬浮窗(如图1和图2),这就比较麻烦了,从而导致早期悬浮窗在实际中比较难以推广。
图 1 锤子系统
图 2 MIUI系统
后来发现安卓本身有一些特殊的方式可以绕过这个权限检查,即将LayoutPar