【移动应用开发技术】浅谈Android应用内悬浮控件实践方案总结_第1页
【移动应用开发技术】浅谈Android应用内悬浮控件实践方案总结_第2页
【移动应用开发技术】浅谈Android应用内悬浮控件实践方案总结_第3页
【移动应用开发技术】浅谈Android应用内悬浮控件实践方案总结_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】浅谈Android应用内悬浮控件实践方案总结

在工作中遇到一个需求,需要在整个应用的上层悬浮显示控件,目标效果如下图:

首先想到的是申请悬浮窗权限,OK~打开搜索引擎,映入眼帘的并不是如何申请,而是“Android悬浮窗权限各机型各系统适配大全、Android绕过权限显示悬浮窗...”,为什么悬浮窗权限会有这么多坑呢?悬浮窗可以在桌面显示,被恶意软件用来偷偷弹广告怎么办?作为一个系统级别的特殊权限,这是它应有的高傲--正确引导用户打开悬浮窗权限才是标准做法,若这就是定论的话这篇文章也没必要写了,我们绕过悬浮窗权限直接去显示,大多数是为了优化用户体验,并不是恶意的。有时我们只想在自己的应用内实现悬浮窗,然而Andorid并没有提供这样的方法,也只好退而求其此的去使用系统级别的悬浮窗权限。OK,既然可以绕过权限申请,再重新定义一下需求:尽量绕过申请权限,实现在app指定界面显示悬浮控件,控件的位置不需要改变

怎么绕过悬浮窗权限呢?网上大多数通过WindowManager添加一个TYPE_TOAST类型的控件,如下:而系统在添加TYPE_TOAST类型控件时默认不需要权限,从而可以绕过悬浮窗权限。但是这种做法并不适配所有机型,比如我亲测过的小米(MIUI8)和Nexus7.1.1机型上就会报错PermissionDenial,需要申请权限,之前这种方式或许可行,但现在肯定不行。放弃TYPE_TOAST方案,不能往窗口里添加视图,那只能乖乖的申请权限了吗?这时你可能想到往所有Activity的固定位置添加视图,模拟“悬浮”效果,比如要实现文章开头的效果,只需要进入新Activity时初始化旋转的角度,让其在视觉上连续就行了。但是要考虑一个问题,在切换Activity时旧Activity的悬浮控件是要销毁的,新Activity的悬浮控件是要生成的,也就是说在切换Activity时这个悬浮控件是会短暂的消失一下,那把Activity切换效果设置为淡入淡出可以吗,在视觉上是可以实现的,但是严格限制了Activity的切换效果,不可行。那还有什么方法可以实现切换Activity时控件在视觉上连续吗?如果你用过共享元素动画的话,便有答案了。悬浮控件在哪里添加呢?可以在BaseActivity里,也可以为Application注册Activity生命周期回调,下面通过后者实现,在Application中为每个Activity添加悬浮控件:切换Activity时启用共享元素动画:这样就解决了切换Activity时悬浮控件短暂消失一下这个问题,然后在添加悬浮控件时,初始化旋转角度就可以实现文章开头的效果了。但是这种方式存在很大的缺陷,首先就是它不兼容Andorid5.0以下,看看4.4那百分之十几的小伙伴,嗯~缺陷很大,其次还有一个致命缺陷,不管把悬浮控件设为INVISIBLE还是透明,只要已经添加了此控件,在切换时它都会先显示一下,这应该是共享元素动画本身的一个BUG.OK~放弃共享元素方案,真的绕不过申请权限了吗?再考虑一下TYPE_TOAST方案,为什么它失效了呢?应该是系统对此类型的控件加了限制,对待TYPE_TOAST不再跳过检查权限步骤,而是像TYPE_PHONE之类一视同仁,那为什么我们的toast却可以跳过呢?toast不就是TYPE_TOAST类型的视图吗?不管如何,反正toast是不需要权限的,那就尝试从toast入手.OK~,现在的关键词是自定义toast.查看Toast类源码,有一个方法眼前一亮:Toast是可以自定义视图的,这为自定义toast提供了可能性,但是显示时长只能设置为LENGTH_SHORT或LENGTH_LONG,我们需要的是无限时长,没有方法实现,除非反射之类的怪招了~嗯~下面奉上通过反射实现无限时长toast的完整代码:有了这个自定义toast,跳过权限显示悬浮窗就非常容易了,理论上可以兼容任意版本,任意机型,因为这只是一个普通的toast,系统没理由不允许一个toast显示的~然而...亲测在Nexus7.1.1及以上不显示,在Android4.4以下无法接受触摸事件,在小米部分机型上无法改变位置.OK~对比一下这些方案:方案1:申请权限

优点:实现简单,只要正确引导用户打开权限即可

缺点:部分机型默认禁用;需权限不友好

方案2:每个界面添加,共享元素过渡

优点:不需权限

缺点:较复杂,只适用于5.0以上,且悬浮控件不可隐藏(共享元素会闪显控件)

方案3:TYPE_TOAST

优点:实现简单

缺点:小米(MIUI8)、7.1.1需要权限,4.4以下无法接受点击事件

方案4:自定义toast

优点:大部分机型不需权限,实现简单

缺点:Nexus7.1.1及以上不显示,4.4以下无法接受点击事件,小米(MIUI8)及部分机型不可改变位置

结合我的需求,我的悬浮控件并不需要改变位置,所以最终选择方案为:最终方案:7.0以下采用自定义toast,7.1及以上引导用户申请权限如果你的需求也适合此方案的话,告诉你个好消息,我已经将此方案封装为可直接调用的库:FixedFloatWindow,即fixed(位置固定的)float(悬浮)Window(窗),可以很方便的使用:最后还有一个问题要解决,我们要实现的是应用内悬浮控件,此方案应用退到后台后仍然可以在桌面显示,怎么控制呢?我们可以记录当前start的Activity数量,每当有Activitystop时,便将此数量减1,当此数量为0时表示应用退到后台,这时隐藏悬浮窗

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论