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可能是Android使用最多的一個控件了乐纸,通常在程序中使用Toast的方式就是一行代碼:
Toast類中提供了setView方法抵代,可以自定義顯示的視圖宪躯。
布局文件toast_layout_root.xml內(nèi)容;
Toast源碼解析
Toast的源碼分析涌穆,主要是三個入口,第一是Toast的構(gòu)造蕴掏,第二是Toast的顯示偶翅,第三是Toast的消失
1、makeText方法
makeText的代碼其實和自定義Toast的代碼差不多番电,inflate一布局,設(shè)置顯示的text和duration辆琅,其中布局對應(yīng)的transient_notification.xml漱办,源碼位于:frameworks\base\core\res\layout\transient_notification.xml
系統(tǒng)Toast的布局文件非常簡單,就是在垂直布局的LinearLayout里放置了一個TextView婉烟。
2娩井、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源碼如下
看下ITransientNotification.aidl 婴谱,就兩個方法蟹但,如下:
具體實現(xiàn)就在TN類,其他進程回調(diào)TN類谭羔,來操作Toast的顯示和消失:
這里可以看出Toast顯示和消失用的Handler機制實現(xiàn)的华糖。
INotificationManager調(diào)用了getService,如下:
得到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
判斷是否系統(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機制顯示和消失篮愉。