System Alert /Overlay系统悬浮窗口被隐藏原理剖析

背景:

在使用系统悬浮窗口时候发现有一个问题,那就是悬浮窗口在其他应用上面显示的好好的。一旦打开设置界面后,就发现悬浮窗口直接被隐藏了,退出设置画面后悬浮窗口又展示了,这个是为啥,为啥悬浮窗会被无故异常?

在这里插入图片描述

上图可以看出在进入设置Activity后毫秒表就隐藏,退出设置后毫秒表才展示出来了。

解密原因:

通过dumpsys window windows可以看到如下:

  Window #8 Window{ea573e2 u0 com.android.settings/com.android.settings.Settings}:
    mDisplayId=0 rootTaskId=117 mSession=Session{c87e6e2 27370:1000} mClient=android.os.BinderProxy@f70d4ad
    mOwnerUid=1000 showForAllUsers=false package=com.android.settings appop=NONE
    mAttrs={(0,0)(fillxfill) sim={adjust=resize} ty=BASE_APPLICATION wanim=0x10302f2
      fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS
      pfl=NO_MOVE_ANIMATION FORCE_DRAW_STATUS_BAR_BACKGROUND HIDE_NON_SYSTEM_OVERLAY_WINDOWS USE_BLAST FIT_INSETS_CONTROLLED
      bhv=DEFAULT
      fitSides=}

这个相关flag相比桌面flag看看

  Window #9 Window{f9d1ba0 u0 com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher}:
    mDisplayId=0 rootTaskId=1 mSession=Session{ce33034 27069:u0a10112} mClient=android.os.BinderProxy@46f6ca3
    mOwnerUid=10112 showForAllUsers=false package=com.android.launcher3 appop=NONE
    mAttrs={(0,0)(fillxfill) sim={adjust=nothing forwardNavigation} layoutInDisplayCutoutMode=always ty=BASE_APPLICATION fmt=TRANSPARENT wanim=0x10302f2
      fl=LAYOUT_IN_SCREEN LAYOUT_INSET_DECOR SHOW_WALLPAPER SPLIT_TOUCH HARDWARE_ACCELERATED DRAWS_SYSTEM_BAR_BACKGROUNDS
      pfl=NO_MOVE_ANIMATION OPTIMIZE_MEASURE FORCE_DRAW_STATUS_BAR_BACKGROUND USE_BLAST FIT_INSETS_CONTROLLED
      vsysui=LAYOUT_STABLE LAYOUT_HIDE_NAVIGATION LAYOUT_FULLSCREEN
      bhv=DEFAULT
      fitSides=}

明显设置Activity多了一个如下的属性HIDE_NON_SYSTEM_OVERLAY_WINDOWS,也就是这个属性flag导致了设置为啥看不到悬浮窗口。

那么有没有什么办法可以避免不要被隐藏么?
当然有啦,不过前提你得是系统app有系统签名哈
具体操作如下:

1、添加一个权限

<uses-permission android:name="android.permission.SYSTEM_APPLICATION_OVERLAY" />

这个权限必须添加,注意和原来添加的

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

权限要注意不是一个,所以不要偷懒

2、有了以上权限后在进行flag设置,设置方式如下:

mLayoutParams.privateFlags = mLayoutParams.privateFlags | PRIVATE_FLAG_SYSTEM_APPLICATION_OVERLAY;

即要在addWindow时候给mLayoutParams.privateFlags或上一个PRIVATE_FLAG_SYSTEM_APPLICATION_OVERLAY

看看最后结果如何:

在这里插入图片描述

是不是设置app已经没有办法能够阻挡我们的悬浮框啦

最后疑问为啥我知道这么修改?哈哈因为认真学习了千里马的framework课程

本文章更多详细代码和资料需要购买课程获取
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

私聊作者+v(androidframework007)

其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值