http://www.open-open.com/lib/view/open1327829239952.html
从功能角度来讲,Mms分为会话列表,消息列表,短信编辑,彩信编辑,短信显示,彩信显示和配置。
从实现角度来看,它分为GUI展示层,发送/接收,彩信解析,彩信附件,信息数据等,这些分类对应着源码中的各种包。
org/w3c/dom里面是一个类库,主要用于彩信格式的解析和显示
ui---GUI展示层,用于展示会话列表,消息列表,消息编辑页,彩信附件编辑,彩信展示,播放幻灯片。负责直接与用户交互。
data---用于操作当前正在编辑的信息的相关数据,比如联系人列表,比如当前对话,比如当前消息。
dom---用于解析彩信内容smil的工具包
drm---用于处理DRM的媒体文件的工具包
layout---为了满足特殊需要而改写的布局元素
model---这里面定义了彩信支持的附件数据结构和附件的组织方式。彩信可包含的内容有图片,视频,音频和文字。这些内容可以单独存在,也可以组合在一起。如果组合在一起就变成了幻灯片。
util---这里面是整个Mms共享的工具类
transaction---对于Mms来讲是最底层的一个包,主要是负责发送信息和接收信息,是发信息的最后处理和收信息的最初处理阶段代码。
ui:
会话列表相关类:ConversationList.java、ConversationListAdapter.java、ConversationListItem.java
ComposeMessageActivity.java----这个是核心的窗口Activity
消息列表相关类MessageXXX:MessageListView.java、MessageListAdapter.java、MessageListItem.java、MessageItem.java
AttachmentEditor.java---信息编辑界面下方显示的已添加的附件,是一个LinearLayout子类,管理着下面四个布局,根据附件的类型动态的显示下面四个View中的某一个。
AudioAttachmentView.java、ImageAttachmentView.java、SlideshowAttachmentView.java、VideoAttachmentView.java
幻灯片相关类---XXXSlideXXX.java
MmsThumbnailPresenter.java---用于在消息列表中,显示彩信的缩略图,因为彩信的内容不固定,可能是图片,可能是音频,可能是视频也可能是幻灯片,所以用这个类来处理并显示彩信的缩略图。
Presenter.java---用来展示附件的一个抽象类。
PresenterFactory.java---工厂方法。
信息编辑界面上方的收件人相关类RecipientsXXX:RecipientsEditor.java、RecipientsAdapter.java
递送报告相关类DeliveryReportXXX:DeliveryReportActivity.java、DeliveryReportAdapter.java、DeliveryReportListItem.java、DeliveryReportItem.java
MessagingPreferenceActivity.java---Mms的配置信息编辑器
ManageSimMessages.java---管理SIM里的消息。
data:
WorkingMessage.java---用来管理当前正在编辑的消息,它从创建,草稿到发送完成后一直存在,只要打开了编辑信息的页面就会创建一个WorkingMessage,直到退出编辑页面。
Conversation.java---用来管理对话Threads,通常用来管理当前的对话,也就是进入的对话和正在进行操作的对话,它也用来管理对话列表,比如查询对话列表。
Contact.java---用来代表一个联系人的信息,和管理联系人,加载联系人信息,其中还有相应的Cache。因为一个联系人的数据是比较多的包含名字,名,姓,各种电话号码,各种地址等等。因为Mms中直接使用Contact来作为联系人,所有信息都是直接从其中获取。另外,由于信息交互中也会涉及到联系人,因为收发信时可以直接使用一串电话号码,这时就需要有如添加联系人的功能。Contact中有很多异步的操作,比如加载联系人信息的时候或者更新Cache的时候都需要异步操作以不阻塞调用者。
ContactList.java---是一个Contact的List列表它继承自ArrayList<Contact>。用来管理一个 Contact列表,或管理多个Contact。因为每个信息可以发送给多个联系人,这时就需要用到ContactList来管理这些收信人。也提供了一些方便存储和传递Contact的方法,比如把多个Contact转成String,或者转成String数组等。
RecipientIdCache.java---用于保存所用到的Contact的Id和地址(电话)。每次WorkingMessage会更新这个Cache,然后ContactList会优先从这个Cache中查询联络人。
model:
彩信附件约束类:XXXContentRestrictionXXX.java:ContentRestriction.java、CarrierContentRestriction.java、ContentRestrictionFactory.java
CarrierContentRestriction.java---是具体的彩信附件约束类,对于不支持的附件,或者附件大小超出限制,或者图像分辨率不对,或者图像超出尺寸,会抛出异常:UnsupportedContentTypeException,ResolutionException,ExceedMessageSizeException,ContentRestrictionException
MediaModelFactory.java---用于从一个Pdu附件中解析出来MediaModel,也就是把Pdu转化为Mms内部的附件数据。
util:
AddressUtils.java---关于地址的工具类,目前只有一个getFrom()方法,用于获取发信人地址。
DraftCache.java---用于标识哪些对话Thread有Draft,哪些没有,也就是用于管理和查询对话的草稿状态,有草稿还是没有。它里面维护了一个HashSet,里面包含了所有含有草稿的Thread Id。它里面也有一个HashSet用于存储OnDraftChangedListener,即当Thread的Draft状态有变化时,DraftCache会调用相应的Listener以告知相应模块,这个对话的草稿状态有所变化。可以通过 DraftCache.setDraftState(threadId, state)来设置某个对话的草稿状态; 可以通过DraftCache.hasDraft(threadId)来查询某个对话是否含有草稿。
Recycler.java---是一个抽象的工具类,里面定义了SmsRecycler和MmsRecycler,用于删除陈旧的消息,或者删除超过信息数量限制的信息。使用方法都是Recycler.getSmsRecycler.deleteOldMessages(context) 或者Recycler.getMmsRecycler.deleteOldMessages(context)
SmileyParser.java---把标点式的表情符号转化为图形的表情,比如把用图标笑脸来代替。
DownloadManager.java---不要被名字骗到,它并不是真正意义上的下载管理器,因为它并不负责任何与下载文件过程或下载文件的管理。它是用于管理与下载相关的配置信息,比如是否是自动下载,以及下载过程的各种通知,比如Notification Bar和Toast提示等。
RateController.java
SendingProgressTokenManager.java
transaction:
实现Retry机制:AbstractRetryScheme.java、DefaultRetryScheme.java
HttpUtils.java—彩信发送与接收的最底层实现者,它负责用HTTP协议接收和发送彩信到MMSC彩信服务中心。
因为所有的Transaction都 是异步的,所以才用观察模式来通知Transaction的处理结果。Transaction都是工作线程,线程间通信没有使用handler+thread??
MessagingNotification.java—专门负责在Status Bar上面做Notification,比如新接收到了信息,或是信息发送失败,或是接收失败等。它被UI层,和底逻辑层共用着。
SimFullReceiver.java--sim卡已满广播接收器
SmsRejectedReceiver.java---短信拒接处理
TransactionBundle.java—Transaction所用的一个数据结构,用于给Transaction传送数据。
TransactionSettings.java—彩信相关配置信息的数据结构,比如MMSC,Proxy,Port等。请求方可能会提供这些数据,如果提供就使用;否则就会从Telephony数据库加载默认的数据,这些数据与运营商和APN的设置有关。
TransactionState.java—标识每一个Transaction处理情况的数据结构,很简单,只是标明处理成功还是失败,用于Transaction回调Observer(TransactionService)时用。
还有com/android/mms根目录下面的一些文件,其中绝大多数是定义的基类异常和一些公共的类。
MmsApp.java---Mms Application会在应用进程启动的时候做一些必要的初始化工作,比如配置,下载,联系人,对话,Smiley解析器和通知等。
MmsConfig.java---管理Mms的一些常用配置,比如彩信大小上限,彩信图片尺寸上限,收信人的个数上限等等。这些配置信息是保存在在 res/xml/mms_config.xml里面。MmsApp在初始化时会调用MmsConfig.init(),在这里面会调用 loadMmsSettings来解析mms_config.xml从而得到所需要的配置信息。其他的模块只通过MmsConfig来访问这些配置信息。
LogTag.java---有关日志跟踪信息的控制。它可以方便的控制日志输出级别。但是实际上整个Mms代码中使用这个LogTag的地方并不多。