Android 簡訊模組分析(二) MMS中四大組件核心功能詳解

來源:互聯網
上載者:User

接下來的分析先從MMS中四大組件(Activity ,BroadCastReceiver,Service,ContentProvider),也是MMS中最核心的部分入手:

一. Activity  

1、ConversationList 對話列表介面,這是進入應用程式的主介面。它有兩個配置屬性android:configChanges="orientation|keyboardHidden":在Android系統中,當程式所啟動並執行環境(如:螢幕方向、鍵盤狀態、字型等級,等等 )發生變化後 會導致Activity被重新啟動(以適應環境變化 ),然而 Activity也可以宣稱自己來應付某些變化(而不是全部讓系統重啟自己 ), configChanges 屬性正是用於指定自己願意應付的變化情況。此處該屬性有兩個值,orientation代表螢幕方向發生改變,keyboardHidden表示鍵盤可訪問狀態發生變化(即鍵盤彈出/收合 ),這意味著當螢幕方向和鍵盤可用狀態發生變化時,Activity不會被重新啟動,而是調用其onConfigurationChanged方法,通常是在該方法中對自己做出調整,以適應變化;launchMode="singleTop":該屬性指示了Activity的載入模式,這與Activity在不同Task之間的重用有關,該屬性共有4個可用選項standard, singleTop,singleTask,singleInstance,它們將與Intent中的FLAG_ACTIVITY_* 標記 常量 協同產生相關作用。 ConversationList類中定義了程式中涉及到的選項菜單、會話項上的操作功能表等UI元素。另外該類中的runOneTimeStorageLimitCheckForLegacyMessages方法用於檢測儲存空間限制。 

2ComposeMessageActivity建立新訊息的使用者介面,通過選項菜單menu_compose_new會調用到該介面。這是個很龐大的類內部實現也很複雜,後面Mms入口部分會詳細介紹。

3、ForwardMessageActivity用於轉寄訊息的Activity,這是ComposeMessageActivity的別名,用於把一條現有訊息的內容帶到建立訊息的介面上; 

4DeliveryReportActivity投遞報告 Activity, 用於報告訊息的投遞狀態,採用對話方塊風格的主題(android:theme="@android:style/Theme.Dialog)。 

5、WarnOfStorageLimitsActivity儲存空間限制警告,用於告知使用者關於儲存空間限制的設定資訊。 

6.  ConfirmRateLimitActivity 發送多條多媒體訊息時向使用者提示確認的介面,它包括了自動應答操作——即使用者超過一段時間未作出響應時自動取消發送。 

7ClassZeroActivity ,ClassZero是一種特殊的短訊息類型,它會直接顯示在使用者螢幕上並等待使用者操作。ClassZeroActivity正是用來顯示此類型的簡訊訊息,並運行使用者將資訊儲存起來。  

8MessagingPreferenceActivity 這是Mms應用的系統配置介面,其中有針對SMS、MMS、儲存限制等配置屬性,以及管理儲存在 SIM卡中的簡訊訊息。該Activity啟動時會檢查當前是否有SIM,以及是否支援MMS來動態調整配置項列表。  

9ManageSimMessages 用於管理Sim卡(手機是單卡)中短訊息的介面,它以列表的形式顯示了儲存在SIM卡中的短訊息,並允許使用者將資訊轉存到手機記憶體中,或者刪除訊息。

10、SearchActivity 用於資訊搜尋的操作介面。Android通過系統服務Context. SEARCH_SERVICE(即SearchManager類)提供了強大的資訊搜尋功能。在該應用中通過對連絡人(或者電話號碼)、主題等資訊的匹配來搜尋資訊,並將結果顯示在一個列表中。 

11SlideshowEditActivity 所謂Slide是指MMS中的一頁內容 即一幀,通常被稱為投影片。 SlideshowEditActivity是多媒體訊息中所有內容(即多個Slide)的列表,使用者可以選定清單項目進入Slide播放/修改介面。 

12、SlideshowActivity 用於播放Slide投影片的介面,它會在全屏狀態下顯示投影片的內容。 

13、SlideEditorActivity 用於編輯Slide投影片內容的操作介面,它提供了添加、移除 文本/圖片/音樂,以及Slide等功能。 

14、EditSlideDurationActivity 用於修改Slide投影片持續顯示時間 的操作介面 ,預設持續顯示時間是5秒。 

15、MultiSelectCntsListActivity 群發資訊時,列出連絡人清單。

16、CBConversationListActivity列出廣播訊息

17、CBMessageListActivity 查看單個廣播訊息

18、WPMessageActivity用於查看收到的wappush資訊。

19、MmsShowActivity用於在收到多媒體訊息時,顯示多媒體訊息中包含圖片,錄影,投影片等特殊格式的多媒體訊息。

20、SimMessagesTab用於雙Sim卡中短訊息的介面,以列表的形式顯示在雙SIM卡中的短訊息。

21、ManageSim2Messages用於管理有Sim卡(手機是雙卡)中短訊息的介面,允許使用者將資訊轉存到手機記憶體中,或者刪除訊息。


二. Receiver

在Mms應用中一共有11個Receiver: 

1、SmsReceiver 短訊息廣播接收器,它負責處理與收到短訊息相關的廣播事件。觸發該接收器啟動並執行intent有兩個: 

 A.android.intent.action.BOOT_COMPLETED    Android系統啟動完成時會發出該廣播,即SmsReceiver會在系統啟動完成時接收到調用。

 B.com.android.mms.transaction.MESSAGE_SENT 該常量的定義在 SmsReceiverService.java中,被用在  SmsSingleRecipientSender. sendMultipartTextMessageGemini方法中——即短訊息發送後觸發的廣播事件。完全和預想的一樣,在SmsReceiver中會啟動SmsReceiverService,啟動代碼在beginStartingService方法裡。值得注意的是它同時還做了“螢幕喚醒鎖定 (WakeLock)” 操作,最終在service啟動完成後,通過回調用finishStartingService方法,解除了螢幕喚醒鎖定。  

2、PrivilegedSmsReceiver 該接收器是SmsReceiver的子類,唯一的區別在於該Receiver的permission增加了android.permission.BROADCAST_SMS。

3、MmsSystemEventReceiver  Mms系統事件接收器,它負責在收到新訊息時向通知區域(即標題列)顯示小表徵圖,以及重新發送在寄件匣中的簡訊。觸發該接收器啟動並執行兩個Intent是:

  A. android.intent.action.BOOT_COMPLETED  與SmsReceiver中的情況相同;

  B. android.intent.action.CONTENT_CHANGED  串連方式改變時系統會發出該廣播,即在串連方式變化,例如從gprs-->wifi時該接收器將被調用;

  在MmsSystemEventReceiver類中,程式一旦獲得資料連線時就會啟動TransactionService服務;當串連方式改變時還會調用PduCache.purge()方法清理緩衝;還有當系統剛剛啟動時會同步通知區域的表徵圖、未讀訊息個數等資訊。 

4、PushReceiver  WAP_PUSH 事件的廣播接收器,該事件發生時代表手機收到了一條新的WAP PUSH message。該接收器被調用後,首先喚醒手機螢幕5秒鐘,然後在一個後台線程中處理push-data,將訊息資料插入到資料庫中,必要時啟動 TransactionService服務以更新通知資訊 。觸發該接收器啟動並執行 Intent是: (intent.action=android.provider.Telephony.WAP_PUSH_RECEIVED, data=application/vnd.wap.mms-message),其中Action.Name定義在android.provider.Telephony類中。值得注意的是該Receiver有申明許可權:android.permission.BROADCAST_WAP_PUSH,這意味著發出該廣播時必須攜帶該授權,否則本 Receiver將不會被觸發執行。

5、MessageStatusReceiver 訊息狀態改變時的廣播接收器,訊息狀態改變是指訊息的投遞狀態(即:是否成功送達、是否被目標使用者閱讀等)的變化,觸發該接收器的Intent是com.android.mms.transaction.MessageStatusReceiver. MESSAGE_STATUS_RECEIVED,該值是申明在MessageStatusReceiver.java檔案中的常量。該廣播事件是在SmsSingleRecipientSender. sendMultipartTextMessageGemini方法中被發出的,收到廣播事件後,Receiver的會做兩件事情:

   A. 取得pdu資料包 更新訊息狀態(在updateMessageStatus方法中);

   B. 更新通知區域的新訊息指示資訊(在MessagingNotification類的blockingUpdateNewMessageIndicator()方法中)。

6、SimFullReceiver  Sim卡簡訊儲存空間滿的事件通知,當系統發現Sim卡中儲存簡訊的空間耗盡時會發出該廣播事件。該接收器完成的工作是在通知區域顯示相關資訊,點擊通知資訊後,可以進入管理Sim卡中短訊息的Activity介面 。 

7、SmsRejectedReceiver 短訊息被拒絕時的事件接收器,當手機的儲存空間不足時會拒絕接收新的短訊息,當該事件發生時SmsRejectedReceiver被調用,它會檢查確認是否是儲存空間不足,然後在通知區域顯示相關通知資訊。

8、BootupReceiver 系統啟動時候響應,並調用QuerySimContactsService將SIM中的連絡人記錄插入到Mms應用下的simcontacts.db資料庫中。

9、CBMessageReceiver 用於響應廣播訊息。

10、WapPushReceiver 是wappush事件的廣播接收器,喚醒系統並分發各種資料格式的wappush資訊。會啟動WapPushReceiverService,啟動代碼在beginStartingService方法裡。值得注意的是它同時還做了“螢幕喚醒鎖定 (WakeLock)” 操作,最終在service啟動完成後,通過回調用finishStartingService方法,解除了螢幕喚醒鎖定。

11、WapPushTimeChangedReceiver 處理設定的時間改變或者網路連接狀態發生改變時候響應該廣播資訊。


三. Service 

      在Mms應用中一共有5個Service,他們分別是:SmsReceiverService、TransactionService、WapPushReceiverService、CBMessageReceiverServiceQuerySimContactsService

       SmsReceiverService是短訊息(SMS)的接收器,兩者都會響應來自通訊網路的通知並收取資訊;TransactionService負責處理與多媒體訊息(MMS)相關的網路業務;WapPushReceiverService負責處理推送的資訊。它們只用於本應用內部(因為其未聲明任何intent-filter),上文介紹的廣播接收器中有顯式啟動它們的代碼。以下我們將分別分析前兩個Service的基本實現。


1、SmsReceiverService 被建立時首先初始化了一個新的背景工作執行緒(HandlerThread對象)用來在後台完成相關動作,緊接著在onStartCommand方法裡會將具體的任務通過訊息(即調用service的Intent)發送給背景工作執行緒進行處理。根據Intent.Action的名稱,背景工作執行緒會處理5種情況: 

  A. ACTION_BOOT_COMPLETE:系統啟動完成後BOOT_COMPLETED,把寄件匣(outbox)中的訊息移動到發送隊列(QueuedBox),然後開始發送隊列中的訊息,最後調用blockingUpdateNewMessageIndicator()方法更新狀態列訊息指示表徵圖;

  B. SMS_RECEIVED_ACTION:處理Sms接收handleSmsReceived,從Intent中取得訊息對象,直接顯示給使用者並保持到資料庫中。 

  C. MESSAGE_SENT_ACTION:處理Sms發送handleSmsSent,用於發送多條資訊的時候。第一條由ACTION_SEND_MESSAGE處理,剩下是該action處理。從待發送訊息佇列中取得訊息,並按次序逐個發送; 

  D. TelephonyIntents.ACTION_SERVICE_STATE_CHANGED:處理通訊網路狀態改變handleServiceStateChanged,使用者從無訊號狀態進入有資訊號狀態後,繼續執行發送任務的情況;

  E. ACTION_SEND_MESSAGE:處理Sms所發送的第一條簡訊,調用handleSendMessage。

2、TransactionService ,是處理與多媒體訊息相關業務的服務元件,根據代碼中的注釋可以瞭解到,收發多媒體訊息時可以是移動資料網路(mobile data network)或Wi-Fi網路。當沒有可用的移動資料網路連接時,會嘗試通過Wi-Fi網路發送或接收MMS資訊(如果有 Wi-Fi 網路的話)。它同樣在onCreate方法裡首先建立了後台背景工作執行緒,通過NetworkConnectivityListener類監聽通訊網路連結狀態的變化,並根據不同的連結狀態作出相應的反應。緊接著就是onStartCommand方法了,它首先會檢測當前的網路連接狀態,然後分別完成以下幾件事情: 

  A.針對收發多媒體訊息的業務,它將intent.getExtras()封裝成一個TransactionBundle,再通過launchTransaction()方法將具體工作交給後台背景工作執行緒去處理。 

  B.如果 intent.getExtras()為Null時,它會嘗試從資料庫中掃描是否有(上次系統結束時)未完成的操作,如果有則遍曆所有操作項,逐個調用 launchTransaction()方法,以完成操作; 

重點還是在後台背景工作執行緒的處理邏輯上,在代碼中表現為handleMessage方法,它共處理以下幾種不同類型的業務訊息: 

  EVENT_CONTINUE_MMS_CONNECTIVITY ,與多媒體訊息系統建立網路連接,它首先會檢查當前是否有待處理的業務,然後通過調用beginMmsConnectivity方法來建立多媒體訊息系統的網路連接,如果網路連接被正確建立,那麼它會通過一個30秒間隔的計時器來維持串連的持續存在;

  EVENT_DATA_STATE_CHANGED ,網路連接狀態發生改變分支,這一分支是通過對NetworkConnectivityListener對象的監聽而獲得回調。在該分支中首先確認了網路連接的有效性,然後建立 TransactionSettings對象,並調用processPendingTransaction方法處理具體的多媒體訊息業務;

  EVENT_TRANSACTION_REQUEST ,這是對具體多媒體訊息業務的處理分支,它首 先建立了承載業務參數的TransactionSettings對象,該對象包含有多媒體訊息中心服務地址(mmscUrl)、Proxy 伺服器地址和連接埠等用於建立網路連接的參數,然後根據不同的業務類型,分別進行處理。當前僅明確處理了以下4中業務: 

 (1)NOTIFICATION_TRANSACTION,通過一條Push資料,通知手機端收到有新資訊; 

 (2)RETRIEVE_TRANSACTION,收取多媒體訊息; 

 (3)SEND_TRANSACTION,發送多媒體訊息; 

 (4)READREC_TRANSACTION,多媒體訊息閱讀報告; 

用於處理具體業務的關鍵代碼在processTransaction方法中,它首先檢查業務是否已存在於處理隊列中(mProcessing & mPending),然後調用beginMmsConnectivityGemini()(雙卡)或beginMmsConnectivity()(單卡)方法確認網路連接有效性,並點亮終端螢幕,然後將業務對象調到處理隊列中並向業務附加觀察者,最後調用業務自身process()方法完成網路通訊。注意:業務的process方法被調用又會觸發觀察者(即當前service) 的update方法被調用,這使得剛才被處理掉的業務從隊列中被移除,並且開始處理下一條業務;

 EVENT_HANDLE_NEXT_PENDING_TRANSACTION ,這是一個多條多媒體訊息業務能夠被連續處理的關鍵分支,首先在當前service中有mProcessing數組列表用於緩衝連續的多媒體訊息業務,每條多媒體訊息業務是一個可被觀察的對象(註:觀察者模式 ),當前service是唯一觀察者,其會感知到一條業務已處理結束,並觸發下一條業務處理的開始; 所有多媒體訊息業務處理完成後, 會調用 service中的endMmsConnectivity()方法,結束與多媒體訊息中心的網路連接,並撤銷螢幕點亮。

3、WapPushReceiverService當被建立時首先初始化了一個新的背景工作執行緒(HandlerThread對象)用來在後台完成相關動作,緊接著在onStartCommand方法裡會將具體的任務通過訊息(即調用service的Intent)發送給背景工作執行緒進行處理。根據Intent.Action的名稱,背景工作執行緒會處理2種情況: 

   A.系統啟動完成後BOOT_COMPLETED:把寄件匣(outbox)中的訊息移動到發送隊列(QueuedBox),然後開始發送隊列中的訊息,最後調用blockingUpdateNewMessageIndicator()方法更新狀態列訊息指示表徵圖;

   B.處理Wappush,調用handleWapPushReceived,從Intent中取得Wappush

訊息對象,直接顯示給使用者並保持到資料庫中。 

4、CBMessageReceiverService當被建立時首先初始化了一個新的背景工作執行緒(HandlerThread對象)用來在後台完成相關動作,緊接著在onStartCommand方法裡會將具體的任務通過訊息(即調用service的Intent)發送給背景工作執行緒進行處理。根據Intent.Action的名稱,背景工作執行緒會處理: Broadcast Message,調用handleCBMessageReceived,從Intent中取得Broadcast Message廣播訊息對象,直接顯示給使用者並保持到資料庫中。 

5、QuerySimContactsService 查詢SIM卡中的連絡人,並將資料插入到簡訊中的simcontacts.db資料庫中。


四. ContentProvider

ContentProvider組織應用程式的資料,並向其他應用程式提供資料。在Mms應用中一共有2個ContentProvider,他們分別是:

1、SuggestionsProvider 提供對Mmssms.db資料庫的訪問。

2、SimContactsProvider 提供對Simcontacts.db資料庫的訪問。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.