系统窗口Toast显示源码解析

让Android融入我的生活!

最近这段时间一直比较闲,没事了就看看源码,研究一下Android框架,随便搞搞html5,就像打杂一样,东打打,西敲敲,前天跟另外一个Android开发同事闲聊,问问他在搞啥,他说在看看蓝牙、Wifi的一些研究,说是智能家居以后肯定是热潮,提前作点准备,各种软件硬件配合,实现各种控制,并且建议我,不要太多研究源码,因为研究源码以后能用是上的就是在华为那些大公司搞搞系统移植啥的,没有其他太多的用处,听人家一说觉得,觉得确实有道理,这也引发了我一些对Android以后道路的思考,不过短时间的思考肯定是无果的,大家如果有啥好的建议,请提一下哈,谢谢!

好了,也就是一边看书,一边搞源码,没事了,看到人家用Toast的,就想到,其实我们要研究源码,根本不需要到处找方向,我们平时用的最基本的,都是可以研究的,比如Activity的setContentView()是如何添加了一个新窗口,并进行详细绘制,最终显示在界面上的;startActivity(intent)当中,intent所带的数据是如何传到下一个Activity的;Activity是如何启动的等等各种问题,都涉及到Android底层的,都值得我们研究,在此,也给大家推荐如下博主和博客:

罗老师,我们公认的Android大牛的所有博客:

Android系统默认Home应用程序(Launcher)的启动过程源代码分析,这博客写的真是太牛了,各种分析,我觉得可能每个看过人都想猛赞!

Android应用程序启动过程源代码分析

Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

qinjning:

Android中将布局文件/View添加至窗口过程分析 —- 从setContentView()谈起

Android中View绘制流程以及invalidate()等相关方法分析

还有一篇是介绍android view绘制流程的,深入到surfaceflinger中了,也讲的非常好,,不过没找到链接地址了,网上资源太多了,大家可以各种搜!

行吧,废话就说这么多了,开始进入我自己的时刻,Toast原理实现分析。

我们在自己的Activity中要调用Toast是非常简单的,Toast.makeText(this, "this is toast", Toast.LENGTH_SHORT).show()这样一句代码就可以显示了,那我们来看一下系统调用过程是怎么样的呢?

我们首先要清楚,添加一个Toast就只需要作好两件事,第一,建立一个窗口,上面设置好文字内容;第二,将这个窗口交给系统,显示出来。

下面分为两步介绍:

一、系统窗口Toast的创建

二、Toast调用流程

Toast.makeText(this, "this is toast", Toast.LENGTH_SHORT).show()即可显示一个Toast信息,先看一下makeText()源码,在Toast类中:

该方法中会根据com.android.internal.R.layout.transient_notification布局文件创建一个View对象,并把该对象赋值给 Toast 的mNextView变量,这就为自定义Toast窗口提供了机会,当然,这仅限于Framework层面的定制,应用程序是无法自定义Toast窗口风格的,其中inflate()方法的流程解析大家可在网上参考其他博客。

创建了 Toast对象后,接下来调用show()方法,此方法在Toast中:

此方法中INotificationManager为一个远程接口,TN为Toast的内部类,继承ITransientNotification.Stub,

创建了一个IBinder对象,new INotificationManager.Stub(),构建了一个量mToastQueue中添加客户端的Toast对象,所有应用程序都是通过调用NotificationManagerService该方法添加客户端的Toast请

求的。因此,该方法中使用了 synchronized(mToastQueue)解决重入问题。

final ITransientNotification callback这个成员变量,show方法就是它来执行的,TN extends ITransientNotification.Stub,TN对象的show()方法,该对象是一个客户端的Binder,其show()方法真正完成向WmS添加窗口。

找一个让心里安静和干净的地方,自己变得跟水晶一般透明,

系统窗口Toast显示源码解析

相关文章:

你感兴趣的文章:

标签云: