背景:
在使用系统悬浮窗口时候发现有一个问题,那就是悬浮窗口在其他应用上面显示的好好的。一旦打开设置界面后,就发现悬浮窗口直接被隐藏了,退出设置画面后悬浮窗口又展示了,这个是为啥,为啥悬浮窗会被无故异常?
上图可以看出在进入设置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