Toast的显示流程

官方的显示流程如下:

那么这时候我们会有个问题,既然排队了,那为什么有一些toast会重叠在一起呢?因为如下:

利用WindowManager

  • 很多 App(尤其是一些大厂 App)为了突破系统 Toast 的各种限制(比如无法自定义复杂动画、在后台被系统拦截等),会选择自己造轮子。

  • 做法是:绕过 NMS,直接使用 WindowManager.addView(),画一个长得跟 Toast 一模一样的黑色半透明圆角 TextView。

  • 假设 App A 调用了系统的 Toast.show()(老实去 NMS 排队了),而 App B 自己用 WindowManager 强行在屏幕顶层画了一个"假 Toast"。这俩根本就不在一个管理体系里,自然就会在屏幕上重叠甚至打架。

利用页面挂载

  • 很多开源工具类(比如早期的某些 ToastUtils)发现系统 Toast 坑太多,干脆不跨进程了。

  • 它们会在你调用显示的时候,直接找到当前 Activity 最顶层的根视图(DecorView),然后把一个长得像 Toast 的 View addView 进去。

  • 这种 Toast 的生命周期和图层只属于当前页面。如果此时系统 NMS 正好在给你推送一个其他 App 的原生 Toast,原生的在系统顶层,自定义的在 App 页面层,两者就会发生重叠。

相关推荐
Easyhood1 小时前
Android 开发入门实践(十四):Compose 副作用入门与四个常用 API
android·开发语言·kotlin·android jetpack·compose
FlightYe2 小时前
音视频修炼之容器与协议(四):RTSP详解
android·linux·ffmpeg·音视频·dash
疯华整猫4 小时前
删掉 LeakCanary 那天,我用 Trae 自己撸了一套:最难的不是分析堆,是决定什么时候 dump
android·人工智能·性能优化
mmsx11 小时前
耳切法切带洞多边形:论文能跑通,真实数据为什么崩
android·kotlin
洞见前行11 小时前
你的 Activity 关了,为什么还活着?Android 内存泄漏从发现、定位到线上治理
android·性能优化·leakcanary
Kapaseker13 小时前
Kotlin 又要加语法糖了:这次轮到 if-else
android·kotlin
恋猫de小郭15 小时前
Flutter 3.50 & Dart 3.14 发布,快来看看有什么更新吧
android·前端·flutter
Starry-sky(jing)1 天前
Vidda ADB 开启:R Pro 65 找不到开发者选项的处理与连接验收
android·adb·远程控制·电视·vidda