Android自定义Overlay被Facebook聊天头像遮挡,求顶层显示方案
哈哈,这个问题我之前也琢磨过类似的场景,给你几个靠谱的思路参考:
Window Type 层级优先级差异:Android系统里不同类型的Window有固定的层级排序,咱们普通开发者常用的
TYPE_APPLICATION_OVERLAY其实优先级不算最高。Facebook大概率是用了**无障碍服务(Accessibility Service)**创建的Window,这类Window的TYPE_ACCESSIBILITY_OVERLAY层级天生比普通应用Overlay高,系统会默认让它处于更上层,而且权限限制更松,普通Overlay根本没法覆盖。SurfaceView/TextureView 独立渲染特性:如果Facebook的聊天头像是用SurfaceView或者TextureView实现的,那它的渲染逻辑和咱们普通View完全不一样。这类组件是直接在系统的SurfaceFlinger层面独立渲染的,相当于拥有自己的独立Surface,和你的Overlay不在同一个绘制通道里。哪怕你每秒重绘Overlay,SurfaceFlinger合成的时候还是会把它的Surface放在你的View绘制内容上面,自然不会有闪烁或者被覆盖的情况。
特殊Window参数与Flag设置:他们可能给Window加了特殊的布局参数,比如在
WindowManager.LayoutParams里设置了zOrderOnTop=true的同时,还配合了更高优先级的系统Flag,比如和锁屏显示相关的FLAG_SHOW_WHEN_LOCKED,或者通过调整layoutInDisplayCutoutMode等参数让系统优先处理这个Window的合成顺序。另外,有些隐藏的系统参数(大厂可能拿到了特殊权限使用)也能强制提升Window层级。系统级权限或专属API支持:作为大厂,Facebook说不定和Google有合作,拿到了普通开发者没有的系统权限,或者使用了一些未公开的API直接操作SurfaceFlinger的合成队列,把他们的聊天头像Window固定在所有普通Overlay的上层。这种情况咱们普通开发者确实没法通过常规手段绕过。
另外你可以试试用无障碍服务来创建自己的Overlay,看看能不能覆盖它——毕竟同类型的Window层级才有可能竞争,说不定能成功。
内容的提问来源于stack exchange,提问作者user648462

