Toast 源码简要分析

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

内容简介: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的源码分析


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

查看所有标签

猜你喜欢:

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

JavaScript核心技术

JavaScript核心技术

Shelley Powers / 苏敬凯 / 机械工业出版社 / 2007-6 / 45.00

Ajax是当今Web开发领域最流行的词汇。而JavaScript与CSS、XML和DOM几种老技术,加上XMLHttpRequest就构成了Ajax的四大基石。对于JavaScript,一些更资深的同事告诉我的感觉是失望。面对不同的浏览器和浏览器的不同版本,没有优秀的调试开发工具,JavaScript成了软件开发的泥潭。. 而本书的出版则给我们增加了一丝解决这些问题的信心。 它从最简单......一起来看看 《JavaScript核心技术》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

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

Markdown 在线编辑器