本篇文章主要介绍了"Android源码解析——Toast",主要涉及到方面的内容,对于Android开发感兴趣的同学可以参考一下:
简介Toast是一种向用户快速提供少量信息的视图。当它显示时,它会浮在整个应用层的上面,并且不会获取到焦点。它的设计思想是能够向用户展示些信息,但又能尽量不显得...
privatevoidscheduleTimeoutLocked(ToastRecord r)
{
mHandler.removeCallbacksAndMessages(r);
Message m = Message.obtain(mHandler, MESSAGE_TIMEOUT, r);
long delay = r.duration == Toast.LENGTH_LONG ? LONG_DELAY : SHORT_DELAY;
mHandler.sendMessageDelayed(m, delay);
}
也就是在delay时间之后发送一个MESSAGE_TIMEOUT的消息来通知Toast隐藏。delay的时间根据Toast设置的duration是否为Toast.LENGTH_LONG来决定是LONG_DELAY(3.5秒)还是SHORT_DELAY(2秒)。
NotificationManagerService
的实现代码很长,为避免篇幅因贴上代码的()() 关系变得太长,这里只介绍了主要流程的代码,具体每个步骤的方法实现,可以自己翻阅该类代码,文件位于SDK的
sources\android-23\com\android\server\notification1`。
总结
对于Toast代码的分析在此告一段落,从上面的分析中我们可以得到以下结论:
- 默认的Toast布局的背景可以在theme中配置。
- Toast的显示及隐藏是通过NotificationManagerService来管理的,它跨进程,使用AIDL来实现进程间通信。
- 所有Toast都会加到
NotificationManagerService
的队列中,对于非系统程序,它会限制Toast的数量(当前我所读的代码中该值为50)以防止DOS攻击及内存泄露的问题。 - Toast的显示及隐藏命令通过new出来的handler来发送。所以没有队列的线程是不能显示Toast的。
- Toast的显示的时间只有两个,duration相当于一个标志位,用于标志显示的时间是长还是短,而不是具体的显示时间。
- 当有Toast要显示时,其所在进程会被设为前台进程。
').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('
').text(i));
};
$numbering.fadeIn(1700);
});
});
以上就介绍了Android源码解析——Toast,包括了方面的内容,希望对Android开发有兴趣的朋友有所帮助。
本文网址链接:http://www.codes51.com/article/detail_925949_5.html