Toast源碼解析

Toast簡介

官方介紹:A toast provides simple feedback about an operation in a small popup. It only fills the amount of space required for the message and the current activity remains visible and interactive. For example, navigating away from an email before you send it triggers a "Draft saved" toast to let you know that you can continue editing later. Toasts automatically disappear after a timeout.

toast

Toast使用

Toast可能是Android使用最多的一個控件了乐纸,通常在程序中使用Toast的方式就是一行代碼:

single line toast

Toast類中提供了setView方法抵代,可以自定義顯示的視圖宪躯。

custom toast

布局文件toast_layout_root.xml內(nèi)容;

toast_layout_root.xml

Toast源碼解析

Toast的源碼分析涌穆,主要是三個入口,第一是Toast的構(gòu)造蕴掏,第二是Toast的顯示偶翅,第三是Toast的消失

1、makeText方法

makeText

makeText的代碼其實和自定義Toast的代碼差不多番电,inflate一布局,設(shè)置顯示的text和duration辆琅,其中布局對應(yīng)的transient_notification.xml漱办,源碼位于:frameworks\base\core\res\layout\transient_notification.xml

transient_notification.xml

系統(tǒng)Toast的布局文件非常簡單,就是在垂直布局的LinearLayout里放置了一個TextView婉烟。

2娩井、show

show

從show方法可以看出里面有兩個新類INotificationManager和TN,tn是由mTN賦值過來的隅很,mTN的實現(xiàn)在Toast的構(gòu)造函數(shù)中撞牢,源碼如下:

接下來,我們就從TN類的源碼出發(fā)叔营,探尋TN的作用屋彪。TN類繼承自ITransientNotification.Stub,ITransientNotification.aidl绒尊,用于進程間通信畜挥,源碼位于frameworks\base\core\java\android\app\ITransientNotification.aidl,TN源碼如下

TN

看下ITransientNotification.aidl 婴谱,就兩個方法蟹但,如下:

ITransientNotification.aidl

具體實現(xiàn)就在TN類,其他進程回調(diào)TN類谭羔,來操作Toast的顯示和消失:

這里可以看出Toast顯示和消失用的Handler機制實現(xiàn)的华糖。

INotificationManager調(diào)用了getService,如下:

INotificationManager

得到INotificationManager服務(wù)瘟裸,再調(diào)用enqueueToast方法客叉,參數(shù)有三個,包名话告,TN兼搏,時間。INofiticationManager接口的具體實現(xiàn)類是NotificationManagerService類沙郭,源碼位置:frameworks\base\services\core\java\com\android\server\notification\NotificationManagerService.java

enqueueToast將Toast加入隊列佛呻,用來顯示Toast,隊列最大數(shù)50

enqueueToast

判斷是否系統(tǒng)的Toast病线,源碼:

判斷Toast是否在隊列當中吓著,源碼:

設(shè)置該Toast為前臺進程,源碼:

直接顯示Toast送挑,源碼:

從enqueueToast方法可知夜矗,先判斷是不是系統(tǒng)和合法的Toast,然后判斷是否在ToastQueue(這里解釋了很多Toast让虐,是一個個顯示的)紊撕,如果存在,只需要更新Toast顯示的時間赡突,如果不在对扶,就直接顯示,回調(diào)給TN類惭缰。到這里浪南,知道了Toast是如何顯示的。還沒有結(jié)束漱受,繼續(xù)追蹤mHandler络凿,來到WorkerHandler :

到這里,知道了Toast是如何消失的。Toast核心代碼顯示和消失源碼分析完成絮记。

總結(jié)

Toast代碼調(diào)用只有一行摔踱,了解這行代碼的背后,有個ToastQueue怨愤,進入隊列之前派敷,會做一些合法性判斷,使用進程間通信進行回調(diào)撰洗,Handler機制顯示和消失篮愉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市差导,隨后出現(xiàn)的幾起案子试躏,更是在濱河造成了極大的恐慌,老刑警劉巖设褐,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冗酿,死亡現(xiàn)場離奇詭異,居然都是意外死亡络断,警方通過查閱死者的電腦和手機裁替,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來貌笨,“玉大人弱判,你說我怎么就攤上這事∽锻铮” “怎么了昌腰?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長膀跌。 經(jīng)常有香客問我遭商,道長,這世上最難降的妖魔是什么捅伤? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任劫流,我火速辦了婚禮,結(jié)果婚禮上丛忆,老公的妹妹穿的比我還像新娘祠汇。我一直安慰自己,他們只是感情好熄诡,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布可很。 她就那樣靜靜地躺著,像睡著了一般凰浮。 火紅的嫁衣襯著肌膚如雪我抠。 梳的紋絲不亂的頭發(fā)上苇本,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音菜拓,去河邊找鬼瓣窄。 笑死,一個胖子當著我的面吹牛尘惧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播递递,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼喷橙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了登舞?” 一聲冷哼從身側(cè)響起贰逾,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菠秒,沒想到半個月后疙剑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡践叠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年言缤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片禁灼。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡管挟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弄捕,到底是詐尸還是另有隱情僻孝,我是刑警寧澤,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布守谓,位于F島的核電站穿铆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏斋荞。R本人自食惡果不足惜荞雏,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望平酿。 院中可真熱鬧讯檐,春花似錦、人聲如沸染服。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柳刮。三九已至挖垛,卻和暖如春痒钝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痢毒。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工送矩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人哪替。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓栋荸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凭舶。 傳聞我的和親對象是個殘疾皇子晌块,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容