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 页面层,两者就会发生重叠。

相关推荐
AFinalStone4 小时前
Android 7系统网络(八)应用API层—ConnectivityManager使用与实战调试
android·网络
plainGeekDev5 小时前
kapt 替换为 KSP
android·java·kotlin
蜡台5 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
阿pin8 小时前
Android随笔-SharedPreferences
android·sp
阿pin8 小时前
Android随笔-DataStore
android·datastore
茶栀(*´I`*)9 小时前
Android 测试入门指南:ADB 基础配置与常用设备管理命令解析
android·adb
gxgldyh11 小时前
Android Framework源码解析(七):BootAnimation 启动流程解析——开机动画是如何显示出来的?
android
达达尼昂12 小时前
在 Claude Cowork 中用好 Claude Fable 5
android·人工智能·后端
sTone8737513 小时前
写时复制COW的第一性理解
android·c++·flutter
sTone8737513 小时前
Zygote的第一性理解
android