Android 原生的 Toast 十分好用,功能也很强大,扩展性也十分 OK,但是有一个致命的缺点:一旦用户屏蔽了 App 的通知权限,则 Toast 也不会显示了!
对于一个上线的产品,这个当然是不能忍的。于是我们会用一些方式来规避这个问题。
首先可能会想到的,是实现一个自定义的 ToastView,在合适的时间将 View 显示在 android.R.id.content 这个 ViewGroup 里面。但是这样并不是十分管用,因为这样的话, ToastView 会和 Acitivity 绑定在一起,当 Activity 不可见时,相应的 Toast 也不可见了。
此时,我们想到另外一种方式,是通过 WindowManager 来处理 ToastView. WindowManager 管理着每个窗口的前后顺序,如果我们把 ToastView 添加到 WindowManager 里面,则就可以一直显示在屏幕上啦。
知道了方法,我们就开发做。其实代码也很简单,直接贴出来了。
1 | public class Toast { |
因为这里的 context 和 WindowManager 都是整个 Application 生命周期的,这里就直接用 static 引用了。其余的见注释好了。
其实如果仔细看官方 android.weidget.Toast 的源码,也可以看到,官方的 Toast 也是通过 WindowManager#addView(View) 来实现的。相关代码我也贴出来:
1 | public void handleShow() { |