Android自定义吐司三

前言

`本篇文章主要讲解的有关Android开发中常用的吐司处理方式以及应用。其它相关的内容,可以参考链接


先附上一个超强大的吐司git链接:https://github.com/getActivity/Toaster

下面主要讲解具体的使用方法
先上效果图:
吐司演示视频

一、集成方式

1.将原始的依赖包下载下来,可根据自己的需求进行修改
2.就是在app上的build中添加: implementation 'com.github.getActivity:Toaster:12.6’这种方式可随时更新,但是不能自己修改想要的方式。

二.具体的使用

在自己的XxxApplication中的onCreate()方法中添加: // 初始化 Toast 框架:Toaster.init(this);
1.显示Toast
Toaster.show("这是一个正常的吐司");

2.显示短的Toast
Toaster.showShort("这是一个短的吐司");

3.显示短长的Toast
Toaster.showLong("这是一个长的吐司");

4. debug 模式下显示 Toast
Toaster.debugShow("这是在debug模式下显示的吐司");

5.延迟显示的Toast
Toaster.delayedShow("这是在延迟下显示的吐司");

6.在子线程中显示的Toast
 new Thread(new Runnable() {
  @Override
   public void run() {
    Toaster.show("这是在子线程中显示的吐司");
      }
    }).start();
    
 7.显示的白色背景的Toast
 ToastParams params = new ToastParams();
 params.text = getString("这是一个白色背景的吐司");
 params.style = new WhiteToastStyle();
 Toaster.show(params);
 
 8.显示的黑色背景的Toast
 ToastParams params = new ToastParams();
 params.text = getString("这是一个黑色背景的吐司");
 params.style = new BlackToastStyle();
 Toaster.show(params);
 9.显示的自定义样式的Toast
  ToastParams params = new ToastParams();
  params.text = getString("这是一个自定义样式的吐司");
  params.style = new CustomToastStyle("自定义样式布局的");
  Toaster.show(params);

三、注意事项以及涉及到的其他第三方框架

1.注意事项

1.Toast 在 Android 7.1 崩溃的问题

 * 这个问题是由于 Android 7.1 加入 WindowToken 校验机制导致的,而这个 WindowToken 是 NotificationManagerService 生成的,这个 WindowToken 是存在一定时效性的,而当应用的主线程被阻塞时,WindowManager 在 addView 时会对 WindowToken 进行校验,但是 WindowToken 已经过期了,这个时候 addView 就会抛出异常。

 * 谷歌在 Android 8.0 就修复了这个问题,修复方式十分简单粗暴,就是直接捕获这个异常,而框架的修复思路跟谷歌类似,只不过修复方式不太一样,因为框架无法直接修改系统源码,所以是直接通过 Hook 的方式对异常进行捕获。
2.通知栏权限关闭后 Toast 显示不出来的问题

* 这个问题的出现是因为原生 Toast 的显示要通过 NMS(NotificationManagerService) 才会 addView 到 Window 上面,而在 NMS 中有一个 `static final boolean ENABLE_BLOCKED_TOASTS = true` 的字段,当这个常量值为 true 时,会触发 NMS 对应用通知栏权限的检查,如果没有通知栏权限,那么这个 Toast 将会被 NMS 所拦截,并输出 `Suppressing toast from package` 日志信息,而小米手机没有这个问题是因为它是将 `ENABLE_BLOCKED_TOASTS` 字段值修改成 `false`,所以就不会触发对通知栏权限的检查,另外我为什么会知道有这个事情?因为我曾经和一名 MIUI 工程师一起确认过这个事情。

* 框架处理这个问题的方式有两种,先判断当前应用是否处于前台状态,如果是则使用自定义的 WindowManager 代替 Toast 来显示,如果当前应用处于后台状态,则会通过 Hook Toast 中的 INotificationManager 接口,将 enqueueToast 方法传递的包名参数修改成 `android` 来欺骗 NotificationManagerService,因为 NotificationManagerService 已经将 `android` 包名的应用纳入白名单,系统会自动放行,需要注意的是,这种方式在 Android 10 上面已经失效了,已经被系统纳入反射黑名单,但是好消息是,通过查看和对比 NotificationManagerService 源码发现,这个问题(关闭通知栏权限后无法在前台弹 Toast 的问题)已经在 Android 10.0 的版本上面被修复了,所以框架只在 Android 9.0 及以下版本并且在关闭了通知栏权限的情况下才去 Hook INotificationManager,另外我还找到了官方关于这块的代码提交记录:[Always allow toasts from foreground apps](https://cs.android.com/android/_/android/platform/frameworks/base/+/58b2453ed69197d765c7254241d9966ee49a3efb),大家可以感兴趣可以看看,还有一个问题,如果你想在 Android 10 及之后的版本仍然能在后台显示 Toast,请保证应用的通知栏权限或者悬浮窗权限处于开启的状态,如果你一定要求在后台状态下要 100% 能显示 Toast,请保证应用有悬浮窗权限,因为在某些厂商的手机上,就算有通知栏权限也是无法在后台显示 Toast,例如我用 HarmonyOS 2.0 测试就不行,所以具体要看产品怎么斟酌。

1.三方框架

* 权限框架:https://github.com/getActivity/XXPermissions

* 网络框架:https://github.com/getActivity/EasyHttp

* 标题栏框架:https://github.com/getActivity/TitleBar

* 悬浮窗框架:https://github.com/getActivity/EasyWindow

* ShapeView 框架:https://github.com/getActivity/ShapeView

* ShapeDrawable 框架:https://github.com/getActivity/ShapeDrawable

* 语种切换框架:[MultiLanguages](https://github.com/getActivity/MultiLanguages)

* Gson 解析容错:[GsonFactory](https://github.com/getActivity/GsonFactory)

* 日志查看框架:[Logcat](https://github.com/getActivity/Logcat)

* 嵌套滚动布局框架:[NestedScrollLayout](https://github.com/getActivity/NestedScrollLayout) 

* Android 版本适配:[AndroidVersionAdapter](https://github.com/getActivity/AndroidVersionAdapter) 

* Android 代码规范:[AndroidCodeStandard](https://github.com/getActivity/AndroidCodeStandard)

* Android 资源大汇总:[AndroidIndex](https://github.com/getActivity/AndroidIndex)

* Android 开源排行榜:[AndroidGithubBoss](https://github.com/getActivity/AndroidGithubBoss)

* Studio 精品插件:[StudioPlugins](https://github.com/getActivity/StudioPlugins) 

* 表情包大集合:[EmojiPackage](https://github.com/getActivity/EmojiPackage)

* AI 资源大汇总:[AiIndex](https://github.com/getActivity/AiIndex)

* 省市区 Json 数据:[ProvinceJson](https://github.com/getActivity/ProvinceJson)

* Markdown 语法文档:[MarkdownDoc](https://github.com/getActivity/MarkdownDoc)

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了Android自定义Toast的使用,提供了大量能使我们快速便捷地处理的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华海渡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值