從網(wǎng)絡上查詢以及自己看源碼獲取到的知識點做下整理。
主要分2部分整理:應用部分; FrameWork框架部分。
?應用部分
google 在2015年已經(jīng)不維護信息了(APP名為Messaging) ,現(xiàn)在Android源碼上都是各大芯片廠商或者終端廠商開發(fā)的信息app。但是基本的業(yè)務框架是一致的。
1.初識架構(gòu)

整個短信主要是由2個主要Activity,加2個遠程Service,2個本地Service,4個Provider以及4個Receiver組成。
>所謂2個主要Activity,一為短信聯(lián)系人界面,即一個listView,外加一些增刪功能,另一個為短信編輯界面
>所謂2個遠程Service,即為AIDL且進程號不同,跑在系統(tǒng)中的負責短信發(fā)送接收,彩信發(fā)送接收的服務
>所謂2個本地Service,即為本應用后臺負責發(fā)送短信與彩信的服務,實為調(diào)用系統(tǒng)服務發(fā)送接收,不過本地有部分邏輯需要處理。
>4個Provider,為:SuggestionsProvider,用于搜索建議,與Search配合,
? ? ? SmsProvider 管理短信數(shù)據(jù)表
? ? ? MmsProvider 管理彩信數(shù)據(jù)庫
? ? ?MmsSmsProvider 管理短彩信共同數(shù)據(jù)庫
>4個Receiver,為:SmsReceiver 短信到來
????PushReceiver 推送,Class0
????SmsSystemEventReceiver? 系統(tǒng)啟動
????PrivilegedSmsReceiver 彩信接收
2.基礎知識
Thread對話---是指用戶與某個聯(lián)系人或某幾個聯(lián)系人之間的一系列信息交互。在Mms中,用Thread Id來標識和管理對話,Thread Id也即在數(shù)據(jù)庫表threads中的_id。可能用Conversation是更易于理解。但是Thread本身就有對話的意思,某些論壇中的一個帖子在英語里就叫Thread。Thread的詞典釋義是:”因特網(wǎng)上關于一個題目一連串的信息 (計算機用語)”,所以這里用Thread,也是比較恰當?shù)摹?/p>
Conversation--是用來管理Thread對話的,Conversation是一個Thread對話的抽象出來數(shù)據(jù)結(jié)構(gòu),它能夠,從數(shù)據(jù) 庫中查詢,刪除一個對話中的消息等,每一個Conversation有一個唯一的Thread Id。但是它也負責一些所有對話的管理,比如查詢所有的對話,刪除所有的對話等(這個應該是設計上面的問題)。
事實上,Conversation更多時候是充當前前對話的角色,比如在新新建信息時,編輯信息時,或是查看某個對話時,都會有一個 Conversation對象存在在,以代表當前信息所處的對話。它是一個近似單鍵,都是通過Conversation的靜態(tài)方法來獲得 Conversation對象,有一些其他的方法也是靜態(tài)的。
ConversationList--負責顯示和編輯所有的對話,以列表形式顯示所有的Thread,每一項代表一個Thread,通常也會顯示這個Thread的狀態(tài),如有無草稿,信息發(fā)送/接收是否成功等。
Message--消息,泛指短信SMS和彩信MMS。因為不再區(qū)分短信和彩信,在對話列表,草稿管理和信息列表中它們都是一樣的,都是信息。 Message的數(shù)據(jù)結(jié)構(gòu)是MessageItem,它是一個純數(shù)據(jù)結(jié)構(gòu),里面存儲著關于一個信息的所有數(shù)據(jù),還有MessageListitem,它是 一個View,專門用于在消息列表中顯示一個信息,里面的數(shù)據(jù)都是從MessageItem獲取。它們統(tǒng)一都被 ComposeMessageActivity,MessageListAdapter和MessageListView來管理。
WorkingMessage--當前消息,它是專門用于代表當前正在創(chuàng)建和編輯的信息的數(shù)據(jù)結(jié)構(gòu)無論是短信還是彩信,在創(chuàng)建和編輯的時候都放在一個WorkingMessage對象里面。這個對象也負責信息的發(fā)送,存儲和存儲為草稿。
Slideshow--在Mms應用里面,彩信是以Slideshow幻燈片的形式來展示的。一個彩信可以有多張幻燈片,每張幻燈片上面可以有圖 片,文字,音頻和視頻,可以設置每張幻燈片的瀏覽時長,布局等,這里的幻燈片與Office中的PowerPoint有幾分類似?;脽羝臄?shù)目限制是以彩 信允許的附件大小為上限,這個也與每張幻燈片上面的媒體大小有關??梢赃@樣講MMS就是以幻燈片形式存在的,創(chuàng)建的時候是一張幻燈片一張幻燈片的編輯,收 到的彩信或編輯完后,就可以一張張的放映瀏覽幻燈片。
需要注意的是以幻燈片方式顯示彩信僅是應用程序?qū)拥奶幚矸绞?,不同的信息應用程序會以不同的方式處理彩信,實際的彩信的數(shù)據(jù)是以標準的Pdu方式進行發(fā)送和接收,是應用程序在發(fā)送前把幻燈片轉(zhuǎn)化成為Pdu,并在接收后把Pdu轉(zhuǎn)化成為自己可識別的幻燈片。
Recipient接受人,這里是指信息的接收者,要么是一個陌生的電話號碼,要么是一個陌生的電子郵件地址(彩信時),要么就是手機聯(lián)系人數(shù)據(jù)庫 中的聯(lián)系人。彩信和短信對接收人的數(shù)量都有限制,這個也是在Mms的Settings時面可以更改的。每一條信息要想發(fā)送成功,必須保證接收人是一個合法 的聯(lián)系人,合法也是不同的手機有不同的定義,但通常來講,要么與聯(lián)系人數(shù)據(jù)庫中的某個聯(lián)系人匹配,要么是一個電話號碼,要么是一個電子郵件地址,其他情況 則視為不合法,對于有不合法接收人的信息,不會進行發(fā)送。管理聯(lián)系人的數(shù)據(jù)結(jié)構(gòu)是Contact和ContactList,其中ContactList是 一個以Contact為元素的ArrayList。Contact不但存儲有聯(lián)系人的一些信息,如名字,電話號碼等,它還能與聯(lián)系人數(shù)據(jù)庫進行同步,也就 是它能保證它是一個合法的聯(lián)絡人,并在數(shù)據(jù)庫中存在。在信息發(fā)送前會先進行一次聯(lián)系人同步,以保證已有的聯(lián)系人是正確的。
3.UI主要組成
>會話列表數(shù)據(jù)刷新圖

>編輯界面的類圖

>短信發(fā)送流程圖

>短信發(fā)送類圖

>短信接收流程圖

4.彩信
MMS為Multimedia Messaging Service的縮寫,中文譯為多媒體短信服務,通過網(wǎng)絡來傳輸數(shù)據(jù)
MMS發(fā)送和接收: 手機終端合成多媒體消息后,可以向網(wǎng)內(nèi)的所有合法用戶發(fā)送多媒體消息。不直接投遞給接收方。先發(fā)送給一個中間服務器 (MMSC)。彩信網(wǎng)關暫時保存彩信,然后通過Push 協(xié)議給接收方發(fā)送一個Push 通知,接收方收到通知后再從MMSC 上獲取彩信內(nèi)容。
與MMSC交互的數(shù)據(jù)為PDU數(shù)據(jù)
Google內(nèi)置包里為我們提供了一系列操作PDU的類(com.google.android.mms)
PduPersister? 用于管理PDU存儲
PduParser 用于解析PDU
PduComposer? 用于生成PDU

彩信發(fā)送流程圖

彩信接收流程圖

彩信不自動下載的情況
在會話界面的MessageListItem中會顯示一個download按鈕,當用戶點擊該按鈕
-->mContext.startService(intent);
-->TransactionService中,處理Action為 RETRIEVE_TRANSACTION的請求
--> transaction = new RetrieveTransaction();
-->transaction.process();
-->byte[] resp = getPdu(mContentLocation);
-->PduParser解析數(shù)據(jù)成pdu
-->isDuplicateMessage 判斷是否是重復的短信
-->PduPersister 再將其存儲
-->sendAcknowledgeInd(retrieveConf); 再發(fā)送Ack給MMSC
-->notifyObservers();? 通知service ,狀態(tài)改變
5.Mms數(shù)據(jù)庫
1.負責數(shù)據(jù)的存儲? ? 短信,彩信,對話列表都存儲在數(shù)據(jù)庫中
2.負責大量的通信? ? 先待發(fā)短信存儲到數(shù)據(jù)庫中,發(fā)送服務將待短信從數(shù)據(jù)庫取出
3.通過ContentProvider,間接的肩負起通知界面數(shù)據(jù)刷新工作? ? ? getContext().getContentResolver().notifyChange()? ? 通知觀察者去刷新數(shù)據(jù)
threads表:在ConversationList.Java中顯示的當前短信
sms表:短信內(nèi)容
pdu表: 彩信內(nèi)容
part表:(存儲彩信內(nèi)容(文本、音樂、圖象)文件名
pending_msgs:存儲待發(fā)送的短信與彩信
drm:用于彩信權(quán)限管理
words:用于存儲關鍵字,搜索時用
SmsProvider用于短信相關數(shù)據(jù)的存取 MmsProvider用于彩信相關數(shù)據(jù)的存取
MmsSmsProvider則用于短彩信通用數(shù)據(jù)的存取,如會話信息、接收者、草稿(公共屬性)等
ps其他參考:
https://blog.csdn.net/hitlion2008/article/category/945580 ?(Mms專題)
https://blog.csdn.net/liucheng2009/article/details/6590432 (短信發(fā)送流程分析)