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