從軟件的功能角度來說,Mms分爲對話列表,消息列表,短信編輯,彩信編輯,短信顯示,彩信顯示和配置。 java
從實現的角度來看,它分爲GUI展現層,發送/接收,彩信解析,彩信附件,信息數據等,這些分類對應着源碼中的各類包。 android
源碼導航 數據庫
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綁定數據。 app
ConversationListItemData.java---表明對話列表中的每一項的數據結構,裏面含有要在對話列表中展現的信息。 dom
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---定義了一些用於顯示一頁幻燈片中的內容的接口,如設置圖像,設置視頻,設置音頻,播放視頻,播放音頻,暫停,隨機定位等等。附件顯示的View:AudioAttachmentView,ImageAttachmentView,SlideshowAttachmentView和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列表,或管理多個Contact。由於每一個信息能夠發送給多個聯繫人,這時就須要用到ContactList來管理這些收信人。也提供了一些方便存儲和傳遞Contact的方法,好比把多個Contact轉成String,或者轉成String數組等。
RecipientIdCache.java---用於保存所用到的Contact的Id和地址(電話)。每次WorkingMessage會更新這個Cache,而後ContactList會優先從這個Cache中查詢聯絡人。
dom---用於解析彩信內容smil的工具包
drm---用於處理DRM的媒體文件的工具包
layout---爲了知足特殊須要而改寫的佈局元素
model---這裏面定義了彩信支持的附件數據結構和附件的組織方式。彩信可包含的內容有圖片,視頻,音頻和文字。這些內容能夠單獨存在,也能夠組合在一塊兒。若是組合在一塊兒就變成了幻燈片。用戶能夠用幻燈片的方式來建立含有多個媒體的附件,圖文並茂的展現。每張幻燈片上面能夠加視頻,音頻,圖片和文字,但一般一張幻燈片上面只容許加一個圖片或視頻,文字是均可以添加的,音頻在沒有視頻的狀況下只能夠添加的。播放的時候能夠設置每張幻燈片的播放時長,以及文字的滾動速度等等。
CarrierContentRestriction.java---是具體的彩信附件檢查站,對於不支持的附件,或者附件大小超出限制,或者圖像分辨率不對,或者圖像超出尺寸,會拋出異常:UnsupportedContentTypeException,ResolutionException,ExceedMessageSizeException,ContentRestrictionException。
ContentRestriction.java是用於檢查附件的接口,外部直接使用這相接口,而具體實現是CarrierContentRestriction
ContentRestrictionFactory.java是建立附件檢查的工廠方法。外部經過這個工廠來建立一個ContentRestriction對象,而後使用其中定義的檢查方法來進行附件內部檢查。
SmilHelper.java用於解析和處理附件中的Smil的工具類。
IModelChangedObserver.java接口,用於監聽附件內容有變化。
Model.java---彩信附件的數據組織方式和管理方式是每個附件都是一個Model的子類,它不但用於管理附件的具體數據,好比Uri,大小,文件名,位置等,也能夠用於在GUI顯示附件和查看附件。
LayoutModel.java---繼承自Model用於管理可視的附件的佈局的類。它用來管理RegionModel等的基本元素。它就比如ViewGroup或LinearLayout,RelativeLayout等一些佈局管理器,用來組織並管理佈局基本元素也就是RegionModel的子類ImageModel,TextModel和VideoModel。
RegionModel.java---繼承自Model用於管理可視附件和佈局,好比圖像,視頻和文字。特別是在顯示可視附件的時候,用於控制可視附件在屏幕中的位置。一個RegionModel表明着一張幻燈片上的一塊區域,它是幻燈片上的佈局基本元素。比如UI元素中的View,但多在使用時都是使用它的子類,也就是ImageModel,TextModel和VideoModel。
RegionMediaModel.java---繼承自MediaModel,是用於多媒體附件中的可視部分的佈局控制,主要用在附件的顯示和播放幻燈片時的控制。它的子類是ImageModel,TextModel和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.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---對於Mms來說是最底層的一個包,用戶不可見,它負責發信息的最後處理和收信息的最初處理。主要是負責發送信息和接收信息。它並非真正的發送和接收信息。是由系統Frameworks裏面來負責接收和發送信息。這個包只是對於Mms應用層來說是發送和接收。
AbstractRetryScheme.java
DefaultRetryScheme.java—這二個類是實現一種Retry機制,由於信息的發送與接收會受到環境的限制,好比如今手機沒信號,或是網絡鏈接不成功,那麼就會把信息放到Pending隊列裏面,等一段時間再從新嘗試發送與接收。這裏的二個類就是爲了實現此Retry機制。
HttpUtils.java—彩信發送與接收的最底層實現者,它負責用HTTP協議接收和發送彩信到MMSC彩信服務中心。
MessageSender.java—像其名字所預示的那樣,它是爲了發送信息而封裝的一個接口,它裏面只有一個方法sendMessage(),UI層只須要調用實現了這個接口的類便可發送信息。
MessagingNotification.java—專門負責在Status Bar上面作Notification,好比新接收到了信息,或是信息發送失敗,或是接收失敗等。它被UI層,和底邏輯層共用着。
MmsMessageSender.java—繼承自MessageSender,專門用於發送彩信。它並非作發送的事情,而是作一些錯誤檢查和前期準備工做,而後啓動TransactionService來作發送相關的事情。
NotificationTransaction.java—繼承自Transaction,負責接收彩信和更新通知(Notification)。當有一個新彩信時,Frameworks會先發出一個短信,稱做彩信通知(NotificationIndication),其內含有彩信相關的信息(MMSC, 彩信的ContentLocation(URL)等),以後是由應用程序本身去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來處理短信。 www.2cto.com
ProgressCallbackEntity.java
PushReceiver.java—一個BroadcastReceiver專門用於接收彩信事件android.provider.Telephony.WAP_PUSH_RECEIVED_ACTION(「android.provider.Telephony.WAP_PUSH_RECEIVED」),它會先作一些預處理,而後啓動TransactionService,TransactionService又會建立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,是一個Activity,TransactionService是一個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的基類,它裏面定義了二個方法getPdu(),sendPdu()這二個方法是從MMSC取彩信數據,和向MMSC發送數據。它是對HttpUtils的一層包裝。
TransactionService.java—是一個Service,接收各類Transaction請求,而後處理Transaction。每一個Transaction都 會開啓新的線程異步的處理,因此當處理完成時又會經過Observer來通知TransactionService。
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的地方並很少。