记一次悬浮窗的上线以及坑点总结

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

正常的申请流程,也就是6.0以上手机的申请流程是跳到一个自己封装的空白权限申请界面,然后跳转到系统自带的悬浮窗申请界面进行权限申请,不管用户给不给权限,都关闭当前空页面。由于系统不同,所以在不同手机上看到的权限申请页面颜值可能就会不一样。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.如何实现悬浮窗可随手指拖动

思路非常简单,监听悬浮窗那个imageView的onTouchListener即可,在刚点击的ACTION_DOWN事件中记录当前的x,y位置,然后在每次移动后获取到本次移动的位置,二者相减就是需要移动的位置,这是自定义view的最基本操作了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.如何实现悬浮窗左右边的吸顶效果

思路也非常简单,监听到手指抬起的动作后,判断当前位置是靠近左边还是右边,靠近左边就以位置动画的方式平移到左边,靠近右边就平移到右边。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.核心,添加悬浮窗的方法

中规中矩,按照android官方的方式添加即可。即获取系统的WindowManager,设置好参数,调用windowManager的addView()方法添加。需要注意的是,在隐藏悬浮窗的时候,最好是移除一下,下次需要显示的时候再添加。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

坑点一览,满满的干货

坑点一  多次添加view会导致crash

这个是很多人都会碰到的,有时候没办法保证只添加一次,就算给了flag也会因为系统原因导致这个flag不准确。所以我在使用的时候就碰到了多次添加了的情况,最后的结果就是crash,解决方案就是在addView方法上加一个try…catch捕获住该异常,妥妥的安全感。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

坑点二  oppo r9(5.1.1)上是有权限的,一直给返回没权限

这段代码是处理6.0以下权限申请的,上面红色部分是原来的代码,下面绿色部分是改过之后的。由于oppo在6.0以下每次检测悬浮窗权限都给false,导致项目中每次都弹框让用户去给权限,最后干脆就oppo 6.0以下直接默认都有权限好了。因为事实也如此,除了小米,其他品牌6.0以下都是有权限的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

坑点三  如何处理输入法和悬浮窗的层级关系

微信里的悬浮窗是在输入法之下的,所以交互的同学也要求咱们的悬浮窗也要在输入法之下。我查看了一下WindowManager源码,我悬浮窗的优先级TYPE_APPLICATION_OVERLAY,上面大字写着明明是在输入法之下的,但是实际表现是在输入法之上了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个问题也是折腾了半天,在源码里找了半天找得是天昏地暗,终于功夫不负有心人,还真让我找着了,windowManager是有一个flag专门用来设置悬浮窗和输入法的关系的,但是由于之前没设置,所以导致最后默认的输入法还是在悬浮窗之下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

既然源头找到了,设置起来就很简单了,如下图,设置好flag_alt_focusable_im这个flag即可。后面发现有一个帖子对flag总结得非常好,这里也推荐给大家,有想了解其他flag的同学可以去看一下这篇帖子:blog.csdn.net/qq_33275597…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

坑点四  如何处理退出app或者按home键的时候关闭悬浮窗

这也是谷歌坑人的地方,都没地方设置这个悬浮窗是否只用到app内,所以默认在桌面上也会显示自己的悬浮窗。比如在微信里显示其他app的悬浮窗,这种糟糕的体验可想而知,用户不给你卸载就真是奇迹了。为了解决这个问题,最初的实现方式是对所有经过的activity进行记录,显示就加1,页面被挂起就减1,如果减到当前计数为0时说明所有页面已经关闭了,就可以隐藏悬浮窗了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是实际上这么做还是有问题的,在部分手机上如果是在首页按返回键的话仍然不能隐藏,这个又是系统级的兼容性问题。为了解决这问题,我后面又做了一个处理,通过注册registerActivityLifecycleCallbacks监听app的前后台回调,检测到如果当前首页被销毁时,应该将悬浮窗进行隐藏。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

坑点五  多次点击悬浮窗以后,打开多个页面

如果你的悬浮窗点击事件是打开页面的话,这里需要注意了,别忘了将这个打开的页面的启动模式设置为singleTop或者是singleTask,从而复用同一个,远离一直按返回的地狱操作。
android:launchMode=“singleTop”
android:launchMode=“singleTask”
**总结:**悬浮窗的坑,只有真正做过的人才懂,不过还好现在已经有很多现成的第三方代码可以CV。但是就算是CV了也不代表可以高枕无忧,应用场景不同总还是会遇到其他的问题,我这里总结了自己遇到的部分坑点,以后还有的话会继续更新,我相信踩的坑越多,成长才会越快。我也希望自己的工作经历能够帮助到大家少走弯路,就像我借鉴了前辈们的成果一样。
demo地址:github.com/dongrong-fu…

写在最后

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料

如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包,最后觉得有帮助、有需要的朋友可以点个赞


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
roid学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值