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内容;

toast_layout_root.xml

Toast源码解析

Toast的源码分析,主要是三个入口,第一是Toast的构造,第二是Toast的显示,第三是Toast的消失

1、makeText方法

makeText

makeText的代码其实和自定义Toast的代码差不多,inflate一布局,设置显示的text和duration,其中布局对应的transient_notification.xml,源码位于:frameworks\base\core\res\layout\transient_notification.xml

transient_notification.xml

系统Toast的布局文件非常简单,就是在垂直布局的LinearLayout里放置了一个TextView。

2、show

show

从show方法可以看出里面有两个新类INotificationManager和TN,tn是由mTN赋值过来的,mTN的实现在Toast的构造函数中,源码如下:

接下来,我们就从TN类的源码出发,探寻TN的作用。TN类继承自ITransientNotification.Stub,ITransientNotification.aidl,用于进程间通信,源码位于frameworks\base\core\java\android\app\ITransientNotification.aidl,TN源码如下

TN

看下ITransientNotification.aidl ,就两个方法,如下:

ITransientNotification.aidl

具体实现就在TN类,其他进程回调TN类,来操作Toast的显示和消失:

这里可以看出Toast显示和消失用的Handler机制实现的。

INotificationManager调用了getService,如下:

INotificationManager

得到INotificationManager服务,再调用enqueueToast方法,参数有三个,包名,TN,时间。INofiticationManager接口的具体实现类是NotificationManagerService类,源码位置:frameworks\base\services\core\java\com\android\server\notification\NotificationManagerService.java

enqueueToast将Toast加入队列,用来显示Toast,队列最大数50

enqueueToast

判断是否系统的Toast,源码:

判断Toast是否在队列当中,源码:

设置该Toast为前台进程,源码:

直接显示Toast,源码:

从enqueueToast方法可知,先判断是不是系统和合法的Toast,然后判断是否在ToastQueue(这里解释了很多Toast,是一个个显示的),如果存在,只需要更新Toast显示的时间,如果不在,就直接显示,回调给TN类。到这里,知道了Toast是如何显示的。还没有结束,继续追踪mHandler,来到WorkerHandler :

到这里,知道了Toast是如何消失的。Toast核心代码显示和消失源码分析完成。

总结

Toast代码调用只有一行,了解这行代码的背后,有个ToastQueue,进入队列之前,会做一些合法性判断,使用进程间通信进行回调,Handler机制显示和消失。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容