badandroid
Ⅰ 人教版英语选修7第二单元课文翻译
包君满意 拉里·贝尔蒙特在一家生产机器人的公司 里工作。最近,该公司要对一个家用机器 人进行试验。这项试验将由拉里的夫人克 莱尔来尝试。 克莱尔并不想把机器人留在家里,特别是 在她丈夫离家三周的这个期间。但是克莱 尔被拉里说服了。他说,机器人不会伤害 她,也不会让别人来伤害她。。这样会是 个意外的收获。然而她初次见到机器人的 时候就感到有点儿吃惊。机器人名叫托尼 ,看上去更像一个人,而不像台机器。他 虽然面部表情毫无变化,但是个子高大、 相貌英俊,二头发平整,声音低沉浑厚。 第二天早晨,托尼戴着围裙,给她端来了 早餐,然后问她是否需要帮忙穿衣打扮。 她感到有点儿不好意思,很快就打发他走 了。机器人如此通人性,这使她觉得心烦 和害怕。 有一天,克莱尔说起,她觉得她自己并不 聪明。托尼则说,克莱尔一定是很不高兴 ,才会说出这样的话来。克莱尔觉得,机 器人会向她表示同情,这有点荒唐可笑。 但是她开始信任托尼了。她告诉托尼她太 胖了,这让她很不高兴。还有对于像拉里 这样很想提高社会地位的人来说,她的家 也不够高雅。她跟格拉迪斯’克拉芬不一 样,格拉迪斯是远近闻名的有钱有势的女 人。 托尼为让克莱尔高兴,答应帮助她,使她 变得漂亮,使她的家变得高雅大方。于是 克莱尔从图书馆借来一堆书给托尼阅读, 或者说给他浏览一下。她惊奇地看着他的 手指翻动着书页,忍不住突然伸出手来摸 他的手指。他的手指甲和他那柔软温暖的 皮肤使她感到大为惊异。她在想,这是多 么可笑啊,他只不过是一台机器呀! 托尼给克莱尔换了个发型,又改变了化妆 风格。因为不允许托尼陪克莱尔去商店, 所以托尼就给她写了一份购物清单。克莱 尔进城去买了窗帘、坐垫、地毯和床上用 品。然后她去了一家珠宝店买项链。柜台 售货员对她很粗鲁,她就打电话给托尼, 让售货员同托尼讲话。售货员马上就改变 了态度。克莱尔对托尼表示感谢,并说他 是个“可爱的人”。她刚一转过身去,就看 到格拉迪斯_·克拉芬站在那儿。克莱尔想 ,被格拉迪斯发现了1,这多么难为情啊! 从格拉迪斯脸上的那种有趣而又惊奇的神 色来看,克莱尔知道,格拉迪斯认为她有 风流韵事了:毕竟格拉迪斯知道她的丈夫 是拉里,而不是托尼。 克莱尔回到家里,坐在扶手椅上气得直哭 。格拉迪斯的一举一动都是克莱尔想模仿 的。托尼告诉克莱尔说,你可以同格拉迪 斯一样,.还建议克莱尔邀请格拉迪斯和 她的朋友到家里来玩,时间就定在托尼离 去和拉里回家之前的那个晚上。托尼想在 此之前将房子改装得焕然一新。 托尼有条不紊地搞着装修。克莱尔有一次 想来帮忙,但是太笨手笨脚了,竞从梯子 上掉了下来。尽管托尼当时在隔壁房间里 ,他还是及时赶过来把她接住了。他把她 紧紧地搂在怀里,她感觉到了他身上有股 暖气。她尖叫了起来,把他推开,跑回她 的房里,那天她就再也没有出来过。 聚会的那天晚上来到了。时钟敲响八点, 客人马上就要到来了。克莱尔叫托尼到另 一间房里去。就在那一瞬间,托尼弯曲胳 膊搂着她,弯下身去把脸贴近她的脸。她 大叫一声“托尼”,然后听到托尼一本正经 地说,明天他不想离开她,而且他并不满 足于仅仅使她开心。就在这时,前门的门 铃响了。托尼放开了她,消失得无影无踪 了。也就在这时候,克莱尔才意识到托尼 早就把前边窗户的窗帘拉开了。她的客人 把这一切看得一清二楚。 克莱尔和她的房子、美食给女士们留下了 深刻的印象。就在他们离开之前,克莱尔 听到格拉迪斯跟另外一个女人小声地说, 她从来没有见过像托尼这样英俊的男人。 受到那些女士的妒忌,这该是多么甜美的 胜利!克莱尔也许并没有她们那样漂亮, 但是他们中没有任何一个人拥有这样英俊 的情人。 这时候,她记起来了——托尼只不过是一 台机器。她高声嚷着:“让我独自呆一会 儿!”就跑上床,哭了一个通宵。第二天早 晨开来一辆汽车,把托尼接走了。 公司对托尼同克莱尔相处三个星期的实验 报告非常满意。托尼保护了一个人免受伤 害,他使克莱尔没有因为她的失败感而伤 害自己。那天晚上,他拉开了窗帘,让其 他女人看到了他和克莱尔在一起,他明白 这么做对克莱尔的婚姻并不造成危害。但 是,尽管托尼很聪明,他还得作一番改建 ——总不能让女人和机 器相爱吧。
Ⅱ 使用系统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