生活资讯
toast弹窗 、安卓toast弹窗
2023-04-09 01:09  浏览:47

Appium自动化之获取APP Toast(消息提示框)的信息

在我们日常使用App过程中,经常会看到App界面有一些弹窗提示(如下图所示)这样的提示框称之为Toast提示框,这些提示元素出现后等待3秒左右就会自动消失,那么我们该如何获取这些元素文字内容呢?

Appium 1.6.3开始支持识别Toast内容,主要是基于UiAutomator2,

因此需要在Capablity配置如下参数:

desired_caps['***tomationName']='ui***tomator2'

安装appium-ui***tomator2-driver: 安装命令如下:

cnpm install appium-ui***tomator2-driver

安装成功后可以在 C:UsersXXXXnode_modules看到对应的文件:

进入登录界面输入错误的用户名或者密码,获取Toast内容:

注意:Toast内容为中文时,顶部必须注释# coding=utf-8 否则会因为编解码导致文字识别失败。

使用系统Toast的问题

记录下在使用系统Toast存在的问题:

1. 当通知权限被关闭时华为等手机Toast不显示;

2. Toast队列机制上在不同手机上可能不同;

3. Toast的BadTokenException问题;

当发现系统Toast存在问题时,不少同学使用自定义TYPE_TOAST弹框来实现相同效果.虽然情况下效果都是OK的,但TYPE_TOAST依然会存在问题:

4. Android8.0之后的token null is not valid问题(实测部分机型问题);

5. Android7.1之后,不允许同时展示两个TYPE_TOAST弹窗(实测部分机型问题);

那么解决方案是:

相信不少同学旧项目中封装的ToastUtil都是直接使用的ApplicationContext作为上下文,然后在需要弹窗的时候直接就是ToastUtil.show(str),这样的使用方式对于我们来说是最方便的啦。

当然,使用YToast你也依然可以沿用这种封装方式,但这种方式在下面这个场景中可能会无法成功展示出弹窗(该场景下原生Toast也一样无法弹出),不过请放心不会导致应用崩溃,而且这个场景出现的概率较小,有以下三个必要条件:

1.通知栏权限被关闭(通知栏权限默认都是打开的)

2.非MIUI手机

3.Android8.0以上的部分手机(我最近测试中的几部8.0+设备都不存在该问题)。

不过,如果想要保证在所有场景下都能正常展示弹窗,还是建议在YToast.make(context)时传入Activity作为上下文,这样在该场景下YToast会启用ActivityToast展示出弹窗。

接下来再详细分析下上面提到的五个问题。

看下方Toast源码中的show()方法,通过AIDL获取到INotificationManager,并将接下来的显示流程控制权交给NotificationManagerService。NMS中会对Toast进行权限校验,当通知权限校验不通过时,Toast将不做展示。

当然不同ROM中NMS可能会有不同,比如MIUI就对这部分内容进行了修改,所以小米手机关闭通知权限不会导致Toast不显示。

如何解决这个问题?只要能够绕过NotificationManagerService即可。

YToast通过使用TYPE_TOAST实现全局弹窗功能,不使用系统Toast,也没有使用NMS服务,因此不受通知权限限制。

我找了四台设备,创建两个Gravity不同的Toast并调用show()方法,结果出现了四种展示效果:

造成这个问题的原因应该是各大厂商ROM中NMS维护Toast队列的逻辑有差异。

同样的,YToast内部也维护着自己的队列逻辑,保证在所有手机上使用DToast的效果相同。

YToast中多个弹窗连续出现时:

相同优先级时,会终止上一个,直接展示后一个;

不同优先级时,如果后一个的优先级更高则会终止上一个,直接展示后一个。

什么情况下windowToken会失效?

UI线程发生阻塞,导致TN.show()没有及时执行,当NotificationManager的检测超时后便会删除WMS中的该token,即造成token失效。

如何解决?

因此对于8.0之前的我们也需要做相同的处理。YToast是通过反射完成这个动作,具体看下方实现:

Android8.0后对WindowManager做了限制和修改,特别是TYPE_TOAST类型的窗口,必须要传递一个token用于校验。

API25:(PhoneWindowManager.java源码)

API26:(PhoneWindowManager.java源码)

为了解决问题一,DovaToast不得不选择绕过NotificationManagerService的控制,但由于windowToken是NMS生成的,绕过NMS就无法获取到有效的windowToken,于是作为TYPE_TOAST的DovaToast就可能陷入第四个问题。

因此,DToast选择在DovaToast出现该问题时引入ActivityToast,在DovaToast无法正常展示时创建一个依附于Activity的弹窗展示出来,不过ActivityToast只会展示在当前Activity,不具有跨页面功能。

如果说有更好的方案,那肯定是去获取悬浮窗权限然后改用TYPE_PHONE等类型,但悬浮窗权限往往不容易获取,目前来看恐怕除了微信其他APP都不能保证拿得到用户的悬浮窗权限。

YToast的弹窗策略就是同一时间最多只展示一个弹窗,逻辑上就避免了此问题。因此仅捕获该异常。

其他建议

如果能够接受Toast不跨界面的话,建议使用SnackBar

来谈谈APP提示弹窗交互设计

移动端常见的提示弹窗可分为3类:提示框、泛Toast 和消息推送。

提示框是一种打断用户操作行为的弹窗,用户必须做出确认、取消等操作才能进行下一步。

常见的用法有功能引导(但别指望傲娇的用户会认真看)、弹出广告信息或者重要通知(虽然用户未必觉得有卵用还感觉有点烦)、提醒用户当前操作会发生什么事情(告诉用户别手贱,想好了再点)、耗时操作提示(安慰客官别着急,菜正在做着)、进行文本输入或功能设置(少跳转一个页面)。

功能引导一般是APP***次安装、UI交互改版或者更新重要功能时对用户进行使用引导,增加用户对某功能的认知度,减轻用户对APP陌生感,避免了用户面对复(nǎo)杂(cán)交互时的一脸懵逼。

广告的弹窗***是能抓人眼球。用户不是烦广告,而是烦对自己没用并且没趣的广告。

有一些操作是无法挽回的,所以需要增加一个确认提示,防止用户误触。

应用正常运行的时候缺少权限会使某些功能无法正常使用,但是乐视你一个薯片……哦不对,视频软件要我定位、通话这种敏感权限,不给还强制关闭APP,这是想干嘛?还是卸载了吧。

申请权限或者应用更新的提示框***能把事情写详细,让用户明白授权权限或者升级APP对自己有什么好处。UC浏览器耍了个心眼,把取消按钮故意设计的不显眼,视觉上引导用户去点击“立即体验”按钮。

如果用户需要进行简单的设置或输入,可以用弹出操作框的形式减少界面跳转。但是操作框大小有限,如果是复杂设置的话***还是跳转新的页面。

用户的耐心比金鱼的记忆时间还短。如果应用3秒没反应用户就会疑惑,5秒没反应用户就可能会觉得是出问题了而去尝试关闭。这时候就体现出了一个有趣的loding界面的重要性了。

为什么是泛Toast 呢,因为现在Toast 的玩法越来越多了。

Android官方设计规范里,Toast 是一种主要用于提示系统消息的轻量级控件,显示一段时间后自动消失,不包含操作也不能从屏幕上手动关闭,不会打断用户的操作,多个Toast 可以叠加出现。

之后Android针对轻量级反馈操作在Material Design中新增加了一种叫Snackbar 的控件。Snackbar 以一个小的弹出框的形式,出现在手机屏幕***部,左侧为提示文本,右侧是操作按钮。Snackbar 不仅会超时自动消失,用户也可以滑动将其关闭,屏幕上同时最多只能显示一个 Snackbar。

Android官方设计规范里Toast 和Snackbar都应该保持简约,不对用户造成过多的打扰,所以不建议提示文本过长(显示时间有限,太长用户看不完),更不建议在其中增加图片和过多按钮。

但是有句名言说得好,规则就是用来打破的。

小米应用市场安装完APP后出现的Toast ,功能上是方便了用户,但是设计上不太好看。

豌豆荚的新版本升级提示用Snackbar 的形式出现,左侧有两个操作按钮。因为豌豆荚的这个Snackbar 是不自动消失的,除非用户点击操作按钮或者滑动才会关闭,所以不会出现用户正在纠结两个按钮该点哪个而Snackbar 超时自动消失的情况。但是一句“新版本已准备好了”就想让用户去升级,看来这版本也没多重要。

上面bilibili这个投币的交互设计挺有趣的,如果投币成功后弹出的Snackbar增加“再次投币”的操作按钮,一定能增加用户投币的数量。

很多APP为了更少的遮挡内容,将Toast移到了顶部。

传统的Toast样式低调,很容易被用户忽略,我们可以按照提示内容设计不同的颜色,也使得APP变得更加生动有趣。

消息推送的使用场景一般是应用处于非活跃状态(未启动或在后台里),为了避免用户错过重要信息而通过系统发出提示,点击消息可跳转到应用内相关页面。

消息推送也经常被用来促进用户活跃度,消息推送的频率和质量反映了一个团队对用户心理的掌握程度。优秀的运营应该对用户群进行详细分类,投其所好才能吸引用户点击,否则用户就会烦的***止APP推送。

有用、好用、有趣,我觉得这是交互设计中最重要的三点。

1、有用:没有反馈的APP毫无生气,而各种乱弹窗又会使用户心烦到恨不得立刻卸载。所以反馈的信息一定是有价值的,让用户知道刚才发生了什么,接下来需要进行什么操作,一些显而易见的情景可以省略掉提示。

2、好用:提示控件的形式一定要把握好,不同的提示类型***要区别展示。对话框会打断用户的操作,一般是处理重要事件,做好用户引导操作;toast是轻量级提示,不会打断用户的操作流程,提示的信息一定要言简意赅,显示时间不宜过长;消息推送最容易成为垃圾信息的重灾区,如果不能决定到底推送给用户哪些信息时,可以在设置里增加一些推送开关。

3、有趣:有趣的事情,大家都会喜欢。我相信即使是很讨厌广告的用户,在看到一个有趣的提示时也会十分感动然后把它关闭;即使是很讨厌等待的用户,在看到一个好玩的等待动画时也会会心一笑,然后时间就不知不觉的过去了。

toast弹窗的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于安卓toast弹窗、toast弹窗的信息别忘了在本站进行查找喔。

发表评论
0评