Toast 源码简要分析

栏目: Android · 发布时间: 5年前

内容简介:Toast的源码分析本篇文章简要分析下Toast的源码。该方法主要是 new 一个 Toast 对象,包含 Toast 的布局、mNextView、以及显示时间等。

Toast的源码分析

本篇文章简要分析下Toast的源码。

Toast.makeText(this,"toast",Toast.LENGTH_LONG).show();

makeText()

该方法主要是 new 一个 Toast 对象,包含 Toast 的布局、mNextView、以及显示时间等。

show()

show 方法主要获取一个 INotificationManager 的 service 对象,并将 pkg、tn、mDuration 插入到系统 service 中的显示 toast 队列。至此我们需要知道 INotificationManager 具备的功能以及 TN 类是什么?另外,在这里也需要知道调用 show,不会立即将 Toast 显示出来,在这里先记住是 系统进程来控制 toast 的显示与消失的

Toast构造方法

因为在 show 方法中直接能够使用 TN 对象,猜测 Toast 构造方法中以及初始化 TN 类,验证确实如此,另外构造方法中也对 TN 的一些属性进行了初始化。

TN类

private static class TN extends ITransientNotification.Stub

查看 TN 类发现其继承 ITransientNotification.Stub 知道 Toast 的核心逻辑离不开 Binder。在 TN 源码中首先初始化了 Toast 的 show 和 hide 的两个 runnable,至此知道 Toast 的 show 和 hide 逻辑依赖于线程(主线程 Handler 处理,设想在子线程中调用 Toast 会有什么问题)。另外 hide 和 show 的逻辑中查看源码,发现也是 windowManager 的 addView 和 removeView 那一套。原理本质上还是比较简单,具备 windowManager 的基础的话。

接着看到 TN 的构造函数,发现很多 windowManager 的信息,所以说 Toast 本质上也是 wm 的一种表现形式。

ITransientNotification.Stub

package android.app;
oneway interface ITransientNotification {
    void show();
    void hide();
}

上述就是 ITransientNotification.Stub 的 aidl 文件,在 TN 类中也有上述两个方法的实现,在 binder 机制中,stub 应该是属于服务端提供的接口方法,远端进程可以通过 new TN 对象来调用 show 和 hide 的方法来自控制 Toast 的显示和消失。

NotificationManagerService

在前面说过,调用 Toast 的 show 方法后,是将当前 toast 对象插入到 service 的 Toast 队列中,那么插入到队列的过程主要做了哪些逻辑呢?1:判断是不是系统 Toast 、2:判断是不是当前要入队的 Toast 已经在队列中 3:将当前 Toast 设置为前台进程(Activity 销毁 Toast 也能显示) 4:Toast存储队列中进行出队操作

在当前类中,出队的过程中会同同时会调用 tn 的 callback 来控制 Toast 的显示,但是消失会通过 handler 的 sendMessage 来控制,以此达到控制 Toast 的显示时长的逻辑。

以上部分参考 Android Toast的源码分析


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JSF第一步

JSF第一步

罗会波 / 清华大学出版社 / 2007-10 / 65.00元

《JSF第一步:JSF+Spring+Hibernate+AJAX编程》讲述JSF是表示层框架的标准,Hibernate是一个比较完善的对象关系映射工具,Spring则提供了一个Web应用的轻量级的解决方案。在开发一个多层的Java EE应用程序时,这些框架可谓是相辅相成、相得益彰,可以称得上是开发轻量级Java EE应用的三剑客。另外,AJAX是一种非常流行的改善用户体验的技术,但目前国内外还没......一起来看看 《JSF第一步》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具