系统窗口Toast显示源码解析
来源:互联网 发布:d3.js圆形动态加载 编辑:程序博客网 时间:2024/05/01 01:18
让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的创建
系统窗口的含义有两个方面:1,系统窗口不依赖于应用,而应用类窗口必须要有一个Activity与之对应;2,系统窗口是由系统创建的,应用程序没有权限创建。但有三个系统窗口除外,分别为TYPE_TOAST、TYPE_INPUT_METHOD、TYPE_WALLPAPTER,从代码的角度看,为什么添加其他窗口需要权限检查,而这三个不需要呢?首先在WMS这端,当客户端请求添加窗口进,就会调用WMS中的addWindow()方法,这段代码在frameworks\base\services\core\java\com\android\server\wm\WindowManagerService中:
对权限进行检查的代码逻辑比较简单,第一种类型就是TYPE_TOAST,从中可以看出各种权限,TYPE_DREAM、TYPE_INPUT_METHOD、TYPE_WALLPAPER、TYPE_PRIVATE_PRESENTATION、TYPE_VOICE_INTERACTION、TYPE_PHONE、TYPE_PRIORITY_PHONE、TYPE_SYSTEM_ALERT、TYPE_SYSTEM_ERROR、TYPE_SYSTEM_OVERLAY,Framework中有一个系统进程system_process,该进程是有权限创建系统窗口的,常见的系统窗口包括状态栏窗口、系统错误对话框等,如果抛开权限问题, 应用程序其实也可以创建任何系统窗口,WmS在创建窗口时,检查完权限后,就会像创建普通窗口一样创建系统窗口。
二、Toast调用流程
Toast.makeText(this, "this is toast", Toast.LENGTH_SHORT).show()即可显示一个Toast信息,先看一下makeText()源码,在Toast类中:
该方法第一步会从mToastQueue中取出最前面的一个Toast对象,mToastQueue.get(0),ToastRecord为NotificationManagerService的一个内部类,并且有final ITransientNotification callback这个成员变量,show方法就是它来执行的,ITransientNotification代码在frameworks\base\core\java\android\app\ITransientNotification目录下,本身是一个接口,只有show()和hide()两个方法,实现类为Toast的内部类TN extends ITransientNotification.Stub,TN对象的show()方法,该对象是一个客户端的Binder, 其show()方法真正完成向WmS添加窗口。
- 系统窗口Toast显示源码解析
- Android -Toast源码解析
- Toast源码解析
- Toast源码解析
- Toast实现源码解析
- Toast窗口的源码分析
- 从问题单处理了解Toast系统窗口显示、Activity窗口创建、WindowManagerService对系统窗口组织排布(一)
- 从问题单处理了解Toast系统窗口显示、Activity窗口创建、WindowManagerService对系统窗口组织排布(二)
- Toast自定义及源码解析
- Android:剖析源码,随心所欲控制Toast显示
- Android:剖析源码,随心所欲控制Toast显示
- Toast源码分析 控制显示时间
- Android源码解析——Toast
- Android 高级自定义Toast及源码解析
- Android 高级自定义Toast及源码解析
- 从Toast显示原理初窥Android窗口管理
- Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析 《五》-Toast
- Toast显示
- 理解迭代法和优化基础
- 【Tech-Android-Jni】Jni中基本方法(2)
- 【Java学习】泛型的安全性与可读性
- android cmd adb命令安装和删除apk应用
- Mule Esb 入门篇
- 系统窗口Toast显示源码解析
- Androidk开发之图像局部放大算法
- SIM卡应用-OPN,PLMN,SPN
- [数据结构复习]图
- CFF认证 图书馆读者访问信息管理
- 数据库索引的设计原则
- Android开发者应该深入学习的10个开源应用项目
- CSDN Markdown简明教程
- UIView 简介(三)contentMode属性 (内容模式)