【Android源码 栏目提醒】:网学会员为广大网友收集整理了,Android Mms专题之:Mms源码结构 - 企业软件开发,希望对大家有所帮助!
Android Mms专题之Mms
源码结构 从软件的功能角度来讲Mms分为对话列表消息列表短信编辑彩信编辑短信显示彩信显示和配置。
从实现的角度来看它分为GUI展示层发送/接收彩信解析彩信附件信息数据等这些分类对应着
源码中的各种包。
源码导航 Mms的
源码的位置在于
android/packages/apps/Mms 其中Mms/src/com/
android/mms里面都是Mms相关的代码而Mms/src/org/w3c/dom里面是一个类库主要用于彩信格式的解析和显示。
这里主要讲一下Mms/src/com/
android/mms下面的一些包和类的主要用途。
ui---GUI展示层用于展示对话列表消息列表消息编辑页彩信附件编辑彩信展示播放幻灯片。
负责直接与用户交互。
ConversationListAdapter.java---对话列表的Adapter用于给显示层ConversationList绑定数据。
ConversationListItemData.java---代表对话列表中的每一项的数据结构里面含有要在对话列表中展示的信息。
ConversationList.java------这是对话列表的显示窗口Activity它是一个ListActivity这几个类都是对话列表的相关类用于显示编辑和管理所有的对话。
ComposeMessageActivity.java----这个是核心的窗口Activity编辑信息显示一条对话Thread中的所有往来信息。
MessageListView会加在其上面另外AttachmentEditor也会加在其上面。
这个Activity也负责响应外部应用程序发送SENDTO或SEND等请求Intent比如外部应用想要发送信息等就由这个Activity来响应。
MessageItem.java---代表一个信息的抽象数据它包含了信息相关的所有内容比如信息的主题消息内容来信地址附件内容等等。
它的所有数据都是公共的内部成员都可以直接访问。
MessageListAdapter.java---用于给消息列表显示层由ComposeMessageActivity创建绑定到MessageListView上绑定数据。
MessageListView.java---用于显示消息列表继承自ListView其生命周期由ComposeMessageActivity来控制显示与否也由它来控制。
MessageListItem.java---是一个布局用于显示和控制消息列表中的每一个消息的显示。
AttachmentTypeSelectorAdapter.java---用于添加附件件时的一个支持的附件列表它就是一个菜单。
AttachmentEditor.java---用于在编辑MMS彩信信息时显示已添加的附件它的生命周期由ComposeMessageActivity来控制显示与否也是由ComposeMessageActivity来控制当有彩信附件时它就会显示否则就被Hide。
它是一个布局管理器管理着下面四个布局根据附件的类型动态的显示下面四个View中的某一个。
AudioAttachmentView.java---在编辑信息器中用于显示音频附件它是继承自线性布局。
并不在代码中直接使用而是在布局文件中来当成布局管理器使用。
ImageAttachmentView.java---在编辑信息器中用于显示图片附件它是继承自线性布局。
并不在代码中直接使用而是在布局文件中来当成布局管理器使用。
SlideshowAttachmentView.java---在编辑信息器中用于显示幻灯片附件它是继承自线性布局。
并不在代码中直接使用而是在布局文件中来当成布局管理器使用。
VideoAttachmentView.java---在编辑信息器中用于显示视频附件它是继承自线性布局。
并不在代码中直接使用而是在布局文件中来当成布局管理器使用。
SlideshowActivity.java—用来全屏播放幻灯片也即幻灯片的展示因为彩信的创建和播放都是以幻灯片的方式进行的也即一张一张的每张上面可以文字图片视频和音频每一张有浏览时长。
SlideshowEditActivity.java---以列表方式管理幻灯片也即是把所有的幻灯片用列表显示出来用户可添加一页幻灯片也可以点击进入编辑某页幻灯片用于创建和编辑幻灯片。
SlideshowEditor.java---用于编辑某页幻灯片比如添加元素删除元素和替换元素这里的元素可以是图片视频音频和文字。
也可以用于编辑整页幻灯片比如删除某页幻灯片调整这页幻灯片在所有幻灯片中的位置等。
它是一个具体操作幻灯片的封装SlideEditorActivity创建它并使用它来完成纪灯片的编辑。
SlideshowPresenter.java---用于展示所有的幻灯片也就是播放所有的幻灯片。
由SlideshowActivity来创建和使用。
SlideViewInterface.java---定义了一些用于显示一页幻灯片中的内容的接口如设置图像设置视频设置音频播放视频播放音频暂停随机定位等等。
附件显示的ViewAudioAttachmentViewImageAttachmentViewSlideshowAttachmentView和VideoAttachmentView均实现了此接口这样AttachmentEditor就可以用统一的接口来控制内容的播放而不用关心具体的内容是什么。
SlideEditorActivity.java---用于编辑某页幻灯片比如添加音频添加视频添加图像添加文字等。
它只是提供用户界面让用户来操作各种按扭以达到添加元素替换元素或是删除元素。
而对具体的幻灯片的操作是通过SlideshowEditor来完成的它主要负责与用户交互。
SlideListItemView.java--- SlideshowEditActivity中列表的每一项的布局管理继承自LinearLayout。
MmsThumbnailPresenter.java---用于在消息列表中显示彩信的缩略图因为彩信的内容不固定可能是图片可能是音频可能是视频也可能是幻灯片所以用这个类来处理并显示彩信的缩略图。
MessagingPreferenceActivity.java---Mms的配置信息编辑器用来编辑和更改配置信息继承息PreferenceActivity。
它负责与用户交互显示和更改配置。
在Mms启动时MmsConfig会从SharedPreference中读出配置信息在运行时其他的类的配置信息都是从MmsConfig中获取的MmsConfig提供了很多Get方法以获取配置信息。
Presenter.java---用来展示附件的一个抽象类。
PresenterFactory.java---工厂方法。
RecipientsAdapter.java RecipientsEditor.java---用于显示信息编辑页面上面的收信人的编辑框它可以有自动补全的功能补全的数据由RecipientsAdapter来提供。
ViewInterface.java---代表一个View的基类用于Slideshow显示内容或是取缩略图。
可以取View的长宽高等。
BasicSlideEditorView.java---编辑某一页幻灯片时所用的布局也就是在SlideEditorActivity.java中使用。
EditSlideDurationActivity.java---顾名思义用于编辑某一页幻灯片的浏览时长。
ManageSimMessages.java---这个是在设置中使用的用来管理SIM里的消息。
在设置中有一项是管理SIM卡上面的消息。
在Mms的设置Settings中有一个选项可以设置是把信息存储在SIM卡还是存储在手机里。
在收信时SmsReceiverService会查看这个设置然后把收到的信息写到相应的地址。
ManageSimMessages也是以列表方式显示SIM里面的信息提供了二个菜单把信息存入手机和删除。
NumberPickerButton.java---用于显示选择数字的按扭在配置里面用。
NumberPickerDialog.java---用于显示选择数字的对话框在配置里面用。
NumberPicker.java---用于在配置的时候选择数字。
这几个NumerPicker主要是用于Settings中的。
DeliveryReportActivity.java---信息发送情况报告。
以列表的方式来显示 DeliveryReportAdapter.java---相应的Adapter DeliveryReportItem.java---相应的数据每一项的数据 DeliveryReportListItem.java---相应每一项的布局。
data---用于操作当前正在编辑的信息的相关数据比如联系人列表比如当前对话比如当前消息。
负责管理当前正在编辑的信息和当前所处的对话以及当前信息用到的联系人。
这些类都是在编辑信息的时候使用由于这些多半都是用来管理数据的而又无法直接做为对象传递给编辑器。
所以它们的很多方法都是静态的也就是这些类都近似单键。
WorkingMessage.java---用来管理当前正在编辑的消息它从创建草稿到发送完成后一直存在只要打开了编辑信息的页面就会创建一个WorkingMessage直到退出编辑页面。
Conversation.java---用来管理对话Threads通常用来管理当前的对话也就是进入的对话和正在进行操作的对话它也用来管理对话列表比如查询对话列表。
Contact.java---用来代表一个联系人的信息和管理联系人加载联系人信息其中还有相应的Cache。
因为一个联系人的数据是比较多的包含名字名姓各种电话号码各种地址等等。
因为Mms中直接使用Contact来作为联系人所有信息都是直接从其中获取。
另外由于信息交互中也会涉及到联系人因为收发信时可以直接使用一串电话号码这时就需要有如添加联系人的功能。
Contact中有很多异步的操作比如加载联系人信息的时候或者更新Cache的时候都需要异步操作以不阻塞调用者。
ContactList.java---是一个Contact的List列表它继承自ArrayList。
用来管理一个Contact列表或管理多个Contact。
因为每个信息可以发送给多个联系人这时就需要用到ContactList来管理这些收信人。
也提供了一些方便存储和传递Contact的方法比如把多个Contact转成String或者转成String数组等。
RecipientIdCache.java---用于保存所用到的Contact的Id和地址电话。
每次WorkingMessage会更新这个Cache然后ContactList会优先从这个Cache中查询联络人。
dom---用于解析彩信内容smil的工具包 drm---用于处理DRM的媒体文件的工具包 layout---为了满足特殊需要而改写的布局元素 model---这里面定义了彩信支持的附件数据结构和附件的组织方式。
彩信可包含的内容有图片视频音频和文字。
这些内容可以单独存在也可以组合在一起。
如果组合在一起就变成了幻灯片。
用户可以用幻灯片的方式来创建含有多个媒体的附件图文并茂的展示。
每张幻灯片上面可以加视频音频图片和文字但通常一张幻灯片上面只允许加一个图片或视频文字是都可以添加的音频在没有视频的情况下只可以添加的。
播放的时候可以设置每张幻灯片的播放时长以及文字的滚动速度等等。
CarrierContentRestriction.java---是具体的彩信附件检查站对于不支持的附件或者附件大小超出限制或者图像分辨率不对或者图像超出尺寸会抛出异常UnsupportedContentTypeExceptionResolutionExceptionExceedMessageSizeExceptionContentRestrictionException。
ContentRestriction.java是用于检查附件的接口外部直接使用这相接口而具体实现是CarrierContentRestriction ContentRestrictionFactory.java是创建附件检查的工厂方法。
外部通过这个工厂来创建一个ContentRestriction对象然后使用其中定义的检查方法来进行附件内部检查。
SmilHelper.java用于解析和处理附件中的Smil的工具类。
IModelChangedObserver.java接口用于监听附件内容有变化。
Model.java---彩信附件的数据组织方式和管理方式是每一个附件都是一个Model的子类它不但用于管理附件的具体数据比如Uri大小文件名位置等也可以用于在GUI显示附件和查看附件。
LayoutModel.java---继承自Model用于管理可视的附件的布局的类。
它用来管理RegionModel等的基本元素。
它就好比ViewGroup或LinearLayoutRelativeLayout等一些布局管理器用来组织并管理布局基本元素也就是RegionModel的子类ImageModelTextModel和VideoModel。
RegionModel.java---继承自Model用于管理可视附件和布局比如图像视频和文字。
特别是在显示可视附件的时候用于控制可视附件在屏幕中的位置。
一个RegionModel代表着一张幻灯片上的一块区域它是幻灯片上的布局基本元素。
好比UI元素中的View但多在使用时都是使用它的子类也就是ImageModelTextModel和VideoModel。
RegionMediaModel.java---继承自MediaModel是用于多媒体附件中的可视部分的布局控制主要用在附件的显示和播放幻灯片时的控制。
它的子类是ImageModelTextModel和VideoModel。
MediaModel.java---继承自Model代表媒体的数据结构管理具体的附件数据同时也用于管理附件的显示控制比如图像的显示音频和视频的播放控制等。
MediaModelFactory.java---用于从一个Pdu附件中解析出来MediaModel也就是把Pdu转化为Mms内部的附件数据。
ImageModel.java—继承自RegionMediaModel用于管理图像附件和控制图像附件的显示。
VideoModel.java---继承自RegionMediaModel用于管理视频附件和控制视频附件的播放。
AudioModel.java----继承自MediaModel用于管理音频附件和控制音频附件的播放 SlideModel.java----继承自Model用于管理一组附件这些附件同一次显示给用户。
就好像幻灯片的一片一样每一个SlideModel里面有一个可以存储Model的列表可以包含文字音频图像或视频其上面的附件同时显示出来。
SlideshowModel.java---继承自Model用于管理一个彩信中的所有附件。
其内含有一个存储SlideModel的列表用于保存和控制一条彩信中的所有附件。
另外它也负责显示这些附件把一个个SlideModel组织起来播放。
它也负责着把这些Mms形式的附件各种Model转化为
Android的附件Pdu和从Pdu提出各自Model因为Slideshow是应用程序层的彩信处理方式而能发送和接收的彩信数据是Pdu。
TextModel.java---继承自RegionMediaModel用于管理文字附件和控制文字附件的显示比如按时间来滚动 util---这里面是整个Mms共享的工具类其中全部都是单键或是直接使用类不可以创建对象和以对象方式来使用 AddressUtils.java---关于地址的工具类目前只有一个getFrom方法用于获取发信人地址。
DraftCache.java---用于标识哪些对话Thread有Draft哪些没有也就是用于管理和查询对话的草稿状态有草稿还是没有。
它里面维护了一个HashSet里面包含了所有含有草稿的Thread Id。
它里面也有一个HashSet用于存储OnDraftChangedListener即当Thread的Draft状态有变化时DraftCache会调用相应的Listener以告知相应模块这个对话的草稿状态有所变化。
可以通过DraftCache.setDraftStatethreadId state来设置某个对话的草稿状态 可以通过DraftCache.hasDraftthreadId来查询某个对话是否含有草稿。
Recycler.java---是一个抽象的工具类里面定义了SmsRecycler和MmsRecycler用于删除陈旧的消息或者删除超过信息数量限制的信息。
使用方法都是Recycler.getSmsRecycler.deleteOldMessagescontext 或者Recycler.getMmsRecycler.deleteOldMessagescontext 用图标笑脸来代替。
SmileyParser.java---把标点式的表情符号转化为图形的表情比如把 DownloadManager.java---不要被名字骗到它并不是真正意义上的下载管理器因为它并不负责任何与下载文件过程或下载文件的管理。
它是用于管理与下载相关的配置信息比如是否是自动下载以及下载过程的各种通知比如Notification Bar和Toast提示等。
RateController.java SendingProgressTokenManager.java transaction---对于Mms来讲是最底层的一个包用户不可见它负责发信息的最后处理和收信息的最初处理。
主要是负责发送信息和接收信息。
它并不是真正的发送和接收信息。
是由系统Frameworks里面来负责接收和发送信息。
这个包只是对于Mms应用层来讲是发送和接收。
AbstractRetryScheme.java DefaultRetryScheme.java—这二个类是实现一种Retry机制因为信息的发送与接收会受到环境的限制比如现在手机没信号或是网络连接不成功那么就会把信息放到Pending队列里面等一段时间再重新尝试发送与接收。
这里的二个类就是为了实现此Retry机制。
HttpUtils.java—彩信发送与接收的最底层实现者它负责用HTTP协议接收和发送彩信到MMSC彩信服务中心。
MessageSender.java—像其名字所预示的那样它是为了发送信息而封装的一个接口它里面只有一个方法sendMessageUI层只需要调用实现了这个接口的类即可发送信息。
MessagingNotification.java—专门负责在Status Bar上面做Notification比如新接收到了信息或是信息发送失败或是接收失败等。
它被UI层和底逻辑层共用着。
MmsMessageSender.java—继承自MessageSender专门用于发送彩信。
它并不是做发送的事情而是做一些错误检查和前期准备工作然后启动TransactionService来做发送相关的事情。
NotificationTransaction.java—继承自Transaction负责接收彩信和更新通知Notification。
当有一个新彩信时Frameworks会先发出一个短信称作彩信通知NotificationIndication其内含有彩信相关的信息MMSC 彩信的ContentLocationURL等之后是由应用程序自己去MMSC用ContentLocation取彩信。
这个NotificationTransaction就是专门用于处理彩信通知的它会从MMSC上取出彩信数据Pdu把它写入数据库中然后更新Notification。
需要注意的是只有彩信的设置是自动获取“auto retrieve”时它才会去下载彩信否则它只处理彩信通知Notification Indication而不去下载彩信。
Observable.java—里面定义了观察对象Transaction是它的一个子类其他的实体Transaction都是观察对象里面有一个列表保存着观察者的引用当一个Transaction完成时或是有异常时就会调用notifyObservers方法来把状态通知给观察者。
Observer.java—观察者TransactionService实现了这个接口。
它是所有Transaction的观察者以监听他们的状态和处理结果因为所有的Transaction都 是异步的所以才用观察模式来通知Transaction的处理结果。
PrivilegedSmsReceiver.java—继承自SmsReceiver短信收信的事件监听者负责监听新短信事件
android.provider.Telephony.Intents.SMS_RECEIVED_ACTION“
android.provider.Telephony.SMS_RECEIVED”当接收到这个Intent时表明有一个新短信。
它会唤起SmsReceiverServier来处理短信。
ProgressCallbackEntity.java PushReceiver.java—一个BroadcastReceiver专门用于接收彩信事件
android.provider.Telephony.WAP_PUSH_RECEIVED_ACTION“
android.provider.Telephony.WAP_PUSH_RECEIVED”它会先做一些预处理然后启动TransactionServiceTransactionService又会创建NotificationTransaction来处理这个彩信通知。
ReadRecTransaction.java RetrieveTransaction.java—继承自Transaction用于主动获取彩信数据。
当彩信设置为非自动获取时需要用户触发获取TransactionService会创建一个RetrieveTransaction来获取彩信数据Pdu存入数据库更新Notification等。
RetryScheduler.java SendTransaction.java—继承自Transaction用于发送彩信数据。
SimFullReceiver.java SmsMessageSender.java—发送短信的封装继承自MessageSender。
它会启动SmsReceiverService来发送。
SmsReceiver.java—是一个BroadcastReceiver不要被其名字唬到它并不负责接收新短信通知相反它用于发送信息接收发送信息请求并唤起SmsReceiverService来处理发送。
这里可能是
Android命名规则的原因
Android里的四大组件都喜欢把其组件的名字加上比如ComposeMessageActivity是一个ActivityTransactionService是一个Service而这里SmsReceiver是一个BroadcastReceiver它与接收短信receiving Sms没有关系。
当然了这完全是一个糟糕的命名。
SmsReceiverService.java—它是一个Service专门用于处理短信的发送与接收。
它是由SmsReceiver和PrivilegedSmsReceiver监听事件然后启动它的自己并不会监听Intent事件。
SmsRejectedReceiver.java SmsSingleRecipientSender.java—继承自SmsMessageSender它针对一个收信人调用Frameworks层接口发送信息对于Mms应用来说这是发送短信的最后一站对就是说对于应用来说它会把短信发送出去。
TransactionBundle.java—Transaction所用的一个数据结构用于给Transaction传送数据。
Transaction.java—各种Transaction的基类它里面定义了二个方法getPdusendPdu这二个方法是从MMSC取彩信数据和向MMSC发送数据。
它是对HttpUtils的一层包装。
TransactionService.java—是一个Service接收各种Transaction请求然后处理Transaction。
每个Transaction都 会开启新的线程异步的处理所以当处理完成时又会通过Observer来通知TransactionService。
TransactionSettings.java—彩信相关配置信息的数据结构比如MMSCProxyPort等。
请求方可能会提供这些数据如果提供就使用否则就会从Telephony数据库加载默认的数据这些数据与运营商和APN的设置有关。
TransactionState.java—标识每一个Transaction处理情况的数据结构很简单只是标明处理成功还是失败用于Transaction回调ObserverTransactionService时用。
还有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的地方并不多。
上一篇:
Android应用程序启动过程源代码分析(2)
下一篇:
7*30m公路预应力混凝土连续梁桥上部结构设计