Messaging中的Receiver R eceiver廣播 接收器用于響應(yīng)系統(tǒng)中的各種廣播事件并執(zhí)行相關(guān)業(yè)務(wù)代碼的組件,常用于完成如:啟動(dòng)service、顯示Activity等 任務(wù) 。在Messagin應(yīng)用中一共有7個(gè) R eceiver: 1、.transaction.SmsReceiver : 短消息 廣播 接收器,它負(fù)責(zé)處理與收到短消息相關(guān)的廣播事件。觸發(fā)該接收器運(yùn)行的intent有兩個(gè): A.android.intent.action.BOOT_COMPLETED--->Android系統(tǒng)啟動(dòng)完成時(shí)會(huì)發(fā)出該廣播,即SmsReceiver會(huì)在系統(tǒng)啟動(dòng)完成時(shí)接收到調(diào)用; B.com.android.mms.transaction.MESSAGE_SENT --->定義在 SmsReceiverService.java中的常量,被用在SmsMessageSender.sendMessage方法中——即短消息發(fā)送后 觸發(fā)的廣播事件; 完全和預(yù)想的一樣,在 SmsReceiver中會(huì)啟動(dòng) SmsReceiverService,啟動(dòng)代碼在beginStartingService方法里。值得注意的是它同時(shí)還做了“屏幕喚醒鎖定 (WakeLock)” 操作,最終在service啟動(dòng)完成后,通過回調(diào)用finishStartingService方法,解除了屏幕喚醒鎖定。 SmsReceiver.java中有編譯錯(cuò)誤,因?yàn)闊o法訪問android.provider.Telephony.Sms.Intents。其實(shí) Intents 所在位置是:myeclair/frameworks/base/core/java/android/provider/Telephony.java,它被標(biāo)記為@hide。
2、 . transaction.PrivilegedSmsReceiver :該接收器是SmsReceiver的子類,唯一的區(qū)別在于該Receiver被申明有permission為android.permission.BROADCAST_SMS。
3、.transaction.MmsSystemEventReceiver :Mms系統(tǒng)事件接收器,它負(fù)責(zé) 在收到新消息時(shí) 向通知區(qū)域(即標(biāo)題欄)顯示小圖標(biāo),和 重新發(fā)送在發(fā)件箱中的MM。觸發(fā)該接收器運(yùn)行的兩個(gè)Intent是: A. android.intent.action.BOOT_COMPLETED ---> :與SmsReceiver中的情況相同; B.android.intent.action.CONTENT_CHANGED ---> :連接方式改變時(shí)系統(tǒng)會(huì)發(fā)出該廣播,即在連接方式變化,例如從gprs-->wifi時(shí)該接收器將被調(diào)用 ; 在MmsSystemEventReceiver類中,程序一旦獲得數(shù)據(jù)連接時(shí)就會(huì)啟動(dòng)TransactionService服務(wù);當(dāng)連接方式改變時(shí)還會(huì)調(diào)用PduCache.purge()方法清理緩存;還有當(dāng)系統(tǒng)剛剛啟動(dòng)時(shí) 會(huì)同步通知區(qū)域的圖標(biāo)、未讀消息個(gè)數(shù)等信息。 MmsSystemEventReceiver.java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問以下類: 1、com.google.android.mms.util.PduCache:位置-myeclair/frameworks/base/core/java/com/google/android/mms/util/PduCache.java,該類未包含在默認(rèn)的android.jar文件中,需要重新編譯; 2、android.provider.Telephony.Mms: 位置- myeclair/frameworks/base/core/java/android/provider/Telephony.java,該類被標(biāo)記為 @hide 。 3、com.android.internal.telephony.TelephonyIntents:位置-myeclair/frameworks/base/telephony/java/com/android/internal/telephony/TelephonyIntents.java,該類是一個(gè)常量類是未被開放的API。 4、com.android.internal.telephony.Phone: 位置- myeclair/frameworks/base/telephony/java/com/android/internal/telephony/Phone.java, 該類被標(biāo)記為 @hide 。
4、.transaction.PushReceiver : WAP_PUSH 事件的廣播接收器,該事件發(fā)生時(shí) 代表手機(jī)收到了一條新的WAP PUSH message。該接收器被調(diào)用后,首先喚醒手機(jī)屏幕5秒鐘,然后在一個(gè)后臺(tái)線程中處理push-data,將消息數(shù)據(jù)插入到數(shù)據(jù)庫中,必要時(shí)啟動(dòng)TransactionService服務(wù)以更新通知信息 。觸發(fā)該接收器運(yùn)行的 Intent是: (intent.action=android.provider.Telephony.WAP_PUSH_RECEIVED, data=application/vnd.wap.mms-message),其中Action.Name定義在android.provider.Telephony類中。值得注意的是該Receiver有申明權(quán)限:android.permission.BROADCAST_WAP_PUSH,這意味著發(fā)出該廣播時(shí)必須攜帶該授權(quán),否則本 Receiver將不會(huì)被觸發(fā)執(zhí)行。 PushReceiver.java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問以下類: 1、android.provider.Telephony : 位置- myeclair/frameworks/base/core/java/android/provider/Telephony.java,該類被標(biāo)記為 @hide 。 2、com.google.android.mms.*: 位置- myeclair/frameworks/base/core/java/com/google/android/mms/*,這些類未包括在公開的API中。
5、. transaction.MessageStatusReceiver :消息狀態(tài)改變時(shí)的廣播接收器,消息狀態(tài)改變是指消息的投遞狀態(tài)(即:是否成功送達(dá)、是否被目標(biāo)用戶閱讀等)的變化,觸發(fā)該接收器的Intent是:com.android.mms.transaction.MessageStatusReceiver. MESSAGE_STATUS_RECEIVED,該值是申明在MessageStatusReceiver.java文件中的常量。該廣播事件是在SmsMessageSender.sendMessage()方法中被發(fā)出的,收到廣播事件后,Receiver的會(huì)做兩件事情:a-取得pdu數(shù)據(jù)包 更新消息狀態(tài)(在updateMessageStatus方法中);b-更新通知區(qū)域的新消息指示信息 (在MessagingNotification.updateNewMessageIndicator()方法中)。 MessageStatusReceiver.java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問以下類: 1、android.provider.Telephony : 位置- myeclair/frameworks/base/core/java/android/provider/Telephony.java,該類被標(biāo)記為 @hide 。 2、com.google.android.mms.util.SqliteWrapper: 位置- myeclair/frameworks/base/core/java/com/google/android/mms/ util/SqliteWrapper.java,該類未包括在公開的API中。
6、.transaction.SimFullReceiver :Sim卡短信存儲(chǔ)空間滿的事件通知,當(dāng)系統(tǒng)發(fā)現(xiàn)Sim卡中存儲(chǔ)短信的空間耗盡時(shí)會(huì)發(fā)出該廣播事件。該接收器完成的工作是在通知區(qū)域顯示相關(guān)信息,點(diǎn)擊通知信息后,可以進(jìn)入管理Sim卡中短消息的Activity界面 。 SimFullReceiver.java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問 android.provider.Telephony 類,所在位置-myeclair/frameworks/base/core/java/android/provider/Telephony.java,該類被標(biāo)記為 @hide 。 7、.transaction.SmsRejectedReceiver :短消息被拒絕時(shí)的事件接收器,當(dāng)手機(jī)的存儲(chǔ)空間不足時(shí)會(huì)拒絕接收新的短消息,當(dāng)該事件發(fā)生時(shí)SmsRejectedReceiver被調(diào)用,它會(huì)檢查確認(rèn)是否是存儲(chǔ)空間不足,然后在通知區(qū)域顯示相關(guān)通知信息。 SmsRejectedReceiver.java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問 android.provider.Telephony 類,所在位置-myeclair/frameworks/base/core/java/android/provider/Telephony.java,該類被標(biāo)記為 @hide 。
Messaging中的Activity Activity是用來構(gòu)建UI(用戶界面 )的組件,用戶操作界面代表了應(yīng)用程序提供的基本功能,是應(yīng)用程序和用戶之間的交互接口。在Messaging應(yīng)用中有以下的Activity: 1、.ui.ConversationList ,對話列表界面,這是進(jìn)入應(yīng)用程序的主界面。它有兩個(gè)配置屬性值得我們特別注意,a.android:configChanges="orientation|keyboardHidden":在Android系統(tǒng)中,當(dāng)程序所運(yùn)行的環(huán)境(如:屏幕方向、鍵盤狀態(tài)、字體等級,等等 )發(fā)生變化后 會(huì)導(dǎo)致Activity被重新啟動(dòng)(以適應(yīng)環(huán)境變化 ),然而 Activity也可以宣稱自己來應(yīng)付某些變化(而不是一股腦地全讓系統(tǒng)重啟自己), configChanges 屬性 正是用于 指定自己愿意 應(yīng)付 的變化情況。此處該屬性有兩個(gè)值, orientation代表屏幕方向發(fā)生改變,keyboardHidden表示鍵盤可訪問狀態(tài)發(fā)生變化(即鍵盤彈出/收起 ),這意味著當(dāng)屏幕方向和鍵盤可用狀態(tài) 發(fā)生變化時(shí), Activity不會(huì)被重新啟動(dòng),而是調(diào)用其onConfigurationChanged方法,通常是在該方法中對自己做出調(diào)整,以適應(yīng)變化;b.launchMode="singleTop":該屬性指示了Activity的加載模式,這與Activity在不同Task之間的重用有關(guān),該屬性共有4個(gè)可用選項(xiàng)standard, singleTop,singleTask,singleInstance,它們將與Intent中的FLAG_ACTIVITY_* 標(biāo)記 常量 協(xié)同產(chǎn)生相關(guān)作用。 ConversationList類中定義了程序中涉及到的選項(xiàng)菜單、會(huì)話(Conversation)項(xiàng)上的上下文菜單等UI元素。另外該類中的runOneTimeStorageLimitCheckForLegacyMessages方法用于檢測存儲(chǔ)空間限制。 SmsRejectedReceiver .java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問以下類: 1.android.provider.Telephony 類,所在位置- myeclair/frameworks/base/core/java/android/provider/Telephony.java,該類被標(biāo)記為 @hide 。 2. com.google.android.mms.*: 位置- myeclair/frameworks/base/core/java/com/google/android/mms/*,這些類未包括在公開的API中。 2、.ui.ComposeMessageActivity ,創(chuàng)建新消息的用戶界面,通過選項(xiàng)菜單menu_compose_new會(huì)調(diào)用到該界面。這是個(gè)很龐大的類,內(nèi)部實(shí)現(xiàn)也很復(fù)雜,等仔細(xì)看了再寫補(bǔ)充吧。 ComposeMessageActivity .java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問以下類: 1.com.android.internal.widget.ContactHeaderWidget類,所在位置-myeclair/frameworks/base/core/java/com/android/internal/widget/ContactHeaderWidget.java,該類被標(biāo)記為 @hide 。 2.com.android.internal.telephony.* 類,所在位置- myeclair/frameworks/ base/telephony/java/com/android/internal/telephony/*,這些類未包括在公開的API中 。 3. com.google.android.mms.*: 位置- myeclair/frameworks/base/core/java/com/google/android/mms/*,這些類未包括在公開的API中 。
3、 .ui.ForwardMessageActivity ,用于轉(zhuǎn)發(fā)消息的Activity,這是ComposeMessageActivity的別名,用于把一條現(xiàn)有消息的內(nèi)容帶到創(chuàng)建消息的界面上;
4、.ui.DeliveryReportActivity ,投遞報(bào)告 Activity, 用于報(bào)告消息的投遞狀態(tài),它采用對話框風(fēng)格的主題(android:theme="@android:style/Theme.Dialog")。 DeliveryReportActivity .java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問以下類: 1. com.google.android.mms.*: 位置- myeclair/frameworks/base/core/java/com/google/android/mms/*,這些類未包括在公開的API中 。 2. android.provider.Telephony 類,所在位置- myeclair/frameworks/base/core/java/android/provider/Telephony.java,該類被標(biāo)記為 @hide 。
5、.ui.WarnOfStorageLimitsActivity ,存儲(chǔ)空間限制警告,用于告知用戶 關(guān)于存儲(chǔ)空間限制的設(shè)置信息。 WarnOfStorageLimitsActivity .java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問以下類: 1. com.android.internal.app.AlertActivity類, 位置- myeclair/frameworks/base/core/java/com/android/internal/app/AlertActivity.java,該類未包括在公開的API中 。 2. com.android.internal.app.AlertController類, 位置- myeclair/frameworks/base/core/java/com/android/internal/app/AlertController.java,該類未包括在公開的API中 。
6.ui.ConfirmRateLimitActivity ,發(fā)送多條彩信時(shí)向用戶提示確認(rèn)的界面,它包括了自動(dòng) 應(yīng)答操作——即用戶 超過一段時(shí)間 未作出響應(yīng)時(shí)自動(dòng)取消發(fā)送。
7、.ui.ClassZeroActivity ,ClassZero是一種特殊的短消息類型,它會(huì)直接顯示在用戶屏幕上并等待用戶操作。ClassZeroActivity正是用來顯示此類型的短信消息 ,并運(yùn)行用戶將信息保存起來 。 ClassZeroActivity .java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問以下類: 1. android.provider.Telephony 類,所在位置- myeclair/frameworks/base/core/java/android/provider/Telephony.java,該類被標(biāo)記為 @hide 。 2. com.google.android.mms.util.SqliteWrapper: 位置- myeclair/frameworks/base/core/java/com/google/android/mms/ util/SqliteWrapper.java ,該類未包括在公開的API中。
8、.ui.MessagingPreferenceActivity ,這是Messaging應(yīng)用的系統(tǒng)配置界面,其中有針對SMS、MMS、存儲(chǔ)限制等配置屬性,以及管理存儲(chǔ)在 SIM卡中 的短信消息。該Activity啟動(dòng)時(shí)會(huì)檢查當(dāng)前是否有SIM,以及是否支持MMS來動(dòng)態(tài)調(diào)整配置項(xiàng)列表。 MessagingPreferenceActivity .java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問TelephonyManager.getDefault()方法,可以考慮使用Context.getSystemService(Context.TELEPHONY_SERVICE)方法來得到類實(shí)例。
9、.ui.ManageSimMessages ,用于管理Sim卡中短消息的界面,它以列表的形式顯示了存儲(chǔ)在SIM卡中的短消息,并允許用戶將信息轉(zhuǎn)存到手機(jī)內(nèi)存中,或者刪除消息。 ManageSimMessages .java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問以下類: 1. android.provider.Telephony 類,所在位置- myeclair/frameworks/base/core/java/android/provider/Telephony.java,該類被標(biāo)記為 @hide 。 2. com.google.android.mms.util.SqliteWrapper: 位置- myeclair/frameworks/base/core/java/com/google/android/mms/ util/SqliteWrapper.java ,該類未包括在公開的API中。
10、.ui.SearchActivity ,用于信息搜索的操作界面。Android通過系統(tǒng)服務(wù)Context. SEARCH_SERVICE(即SearchManager類)提供了強(qiáng)大的信息搜索功能。在該應(yīng)用中通過對聯(lián)系人(或者電話號碼)、主題等信息的匹配來搜索信息,并將結(jié)果顯示在一個(gè)列表中。 SearchActivity .java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問以下類: 1. android.provider.Telephony 類,所在位置- myeclair/frameworks/base/core/java/android/provider/Telephony.java,該類被標(biāo)記為 @hide 。
11、.ui.SlideshowEditActivity , 所謂Slide是指MM中的一頁內(nèi)容 即一幀,通常被稱為幻燈片。 SlideshowEditActivity是彩信中所有內(nèi)容(即多個(gè)Slide)的列表,用戶可以選定列表項(xiàng)進(jìn)入Slide播放/修改界面。 SlideshowEditActivity .java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問以下類: 1. com.google.android.mms.*: 位置- myeclair/frameworks/base/core/java/com/google/android/mms/*,這些類未包括在公開的API中 。
12、.ui.SlideshowActivity , 用于播放Slide幻燈片的界面,它會(huì)在全屏狀態(tài)下顯示幻燈片的內(nèi)容。 SlideshowActivity .java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問以下類: 1. com.google.android.mms.*: 位置- myeclair/frameworks/base/core/java/com/google/android/mms/*,這些類未包括在公開的API中 。
13、.ui.SlideEditorActivity ,用于編輯Slide幻燈片內(nèi)容的操作界面,它提供了:添加、移除 文本/圖片/音樂,以及Slide等功能。 SlideEditorActivity .java中有編譯錯(cuò)誤,因?yàn)樗鼰o法訪問以下類: 1. com.google.android.mms.*: 位置- myeclair/frameworks/base/core/java/com/google/android/mms/*,這些類未包括在公開的API中 。
14、.ui.EditSlideDurationActivity ,用于修改Slide幻燈片持續(xù)顯示時(shí)間 的操作界面 ,默認(rèn)持續(xù)顯示時(shí)間是5秒。 EditSlideDurationActivity .java編譯無錯(cuò)誤。
Messaging中的Service 應(yīng)用中共有兩個(gè)service:.transaction.TransactionService 和 .transaction.SmsReceiverService,前者負(fù)責(zé)處理與彩信(MMS)相關(guān)的網(wǎng)絡(luò)業(yè)務(wù),后者是短消息(SMS)的接收器,兩者都會(huì)響應(yīng)來自通訊網(wǎng)絡(luò)的通知并收取信息。它們只用于本應(yīng)用內(nèi)部(因?yàn)槠湮绰暶魅魏蝘ntent-filter),上文介紹的廣播接收器中有顯式啟動(dòng)它們的代碼。以下我們將分別分析兩個(gè)Service的基本實(shí)現(xiàn)。
1、.transaction.SmsReceiverService ,它被創(chuàng)建時(shí)首先 初始化了新的工作線程(HandlerThread對象)用來在后臺(tái)完成相關(guān)動(dòng)作,緊接著在onStartCommand方法里會(huì)將具體的任務(wù)通過消息(即調(diào)用service的Intent)發(fā)送給工作線程進(jìn)行處理。根據(jù)Intent.Action的名稱,工作線程會(huì)處理4中情況: A.系統(tǒng)啟動(dòng)完成后BOOT_COMPLETED:把發(fā)件箱(outbox)中的消息移動(dòng)到發(fā)送隊(duì)列(QueuedBox),然后開始發(fā)送隊(duì)列中的消息,最后調(diào)用updateNewMessageIndicator方法更新狀態(tài)欄消息指示圖標(biāo); B.處理Sms接收handleSmsReceived:從Intent中取得消息對象,直接顯示給用戶(Class0類型)或者保持到數(shù)據(jù)庫中。 C.處理Sms發(fā)送handleSmsSent:從待發(fā)送消息隊(duì)列中取得消息,并按次序逐個(gè)發(fā)送; D.處理通訊網(wǎng)絡(luò)狀態(tài)改變handleServiceStateChanged:用戶從無信號狀態(tài)進(jìn)入有信息號狀態(tài)后,繼續(xù)執(zhí)行發(fā)送任務(wù)的情況;
2、.transaction.TransactionService , 是處理與彩信相關(guān)業(yè)務(wù)的服務(wù)組件,根據(jù)代碼中的注釋可以了解到: 收發(fā)彩信時(shí)可以是移動(dòng)數(shù)據(jù)網(wǎng)絡(luò)(mobile data network)或Wi-Fi網(wǎng)絡(luò)。當(dāng)沒有可用的移動(dòng)數(shù)據(jù)網(wǎng)絡(luò)連接時(shí),會(huì)嘗試通過Wi-Fi網(wǎng)絡(luò)發(fā)送/接收MMS信息(如果有 Wi-Fi 網(wǎng)絡(luò)的話)。 它 同樣在onCreate方法里首先創(chuàng)建了后臺(tái)工作線程,通過NetworkConnectivityListener類( 一個(gè)被@hide的類 )監(jiān)聽通訊網(wǎng)絡(luò)鏈接狀態(tài)的變化,并根據(jù)不同的鏈接狀態(tài)作出相應(yīng)的反應(yīng)。 緊接著就是onStartCommand方法了,它首先會(huì)檢測當(dāng)前的網(wǎng)絡(luò)連接狀態(tài),然后分別完成以下幾件事情: A.針對收發(fā)彩信的業(yè)務(wù),它將intent.getExtras()包裝成一個(gè)DTO—— TransactionBundle,再通過launchTransaction()方法將具體工作交給后臺(tái)工作線程去處理。 B.如果 intent.getExtras()為Null時(shí),它會(huì)嘗試從數(shù)據(jù)庫中掃描是否有(上次系統(tǒng)結(jié)束時(shí))未完成的操作,如果有則遍歷所有操作項(xiàng),逐個(gè)調(diào)用launchTransaction()方法,以完成操作;
重點(diǎn)還是在后臺(tái)工作線程的處理邏輯上,在代碼中表現(xiàn)為handleMessage方法,它共處理以下幾種不同類型的業(yè)務(wù)消息:
Ⅰ.EVENT_CONTINUE_MMS_CONNECTIVITY ,與彩信系統(tǒng)建立網(wǎng)絡(luò)連接,它首 先會(huì)檢查當(dāng)前是否有待處理的業(yè)務(wù),然后通過調(diào)用beginMmsConnectivity方法來創(chuàng)建于彩信系統(tǒng)的網(wǎng)絡(luò)連接,如果網(wǎng)絡(luò)連接被正確建立,那么它會(huì)通過一個(gè)30秒間隔的計(jì)時(shí)器來維持連接的持續(xù)存在;
Ⅱ.EVENT_DATA_STATE_CHANGED ,網(wǎng)絡(luò)連接狀態(tài)發(fā)生改變分支,這一分支是通過對NetworkConnectivityListener對象的監(jiān)聽而獲得回調(diào)。在該分支中首先確認(rèn)了網(wǎng)絡(luò)連接的有效性,(代碼在此處僅允許ConnectivityManager.TYPE_MOBILE_MMS類型那么wi-fi連接屬于該類型? ),然后創(chuàng)建 TransactionSettings對象,并調(diào)用processPendingTransaction方法處理具體的彩信業(yè)務(wù);
Ⅲ.EVENT_TRANSACTION_REQUEST ,這是對具體彩信業(yè)務(wù)的處理分支,它首 先創(chuàng)建了承載業(yè)務(wù)參數(shù)的TransactionSettings對象,該對象包含有彩信中心服務(wù)地址(mmscUrl)、代理服務(wù)器地址和端口等用于建立 網(wǎng)絡(luò)連接的參數(shù),然后根據(jù)不同的業(yè)務(wù)類型,分別進(jìn)行處理。當(dāng)前僅明確處理了以下4中業(yè)務(wù): 1、NOTIFICATION_TRANSACTION,通過一條Push數(shù)據(jù),通知手機(jī)端收到有新信息; 2、RETRIEVE_TRANSACTION,收取彩信; 3、SEND_TRANSACTION,發(fā)送彩信; 4、READREC_TRANSACTION,彩信閱讀報(bào)告; 用于處理具體業(yè)務(wù)的關(guān)鍵代碼在processTransaction方法中,它首先檢查業(yè)務(wù)是否已存在于處理隊(duì)列中(mProcessing & mPending),然后調(diào)用beginMmsConnectivity()方法確認(rèn)網(wǎng)絡(luò)連接有效性,并點(diǎn)亮終端屏幕,然后將業(yè)務(wù)對象條件到處理隊(duì)列中并向業(yè)務(wù)附加觀察者,最后調(diào)用業(yè)務(wù)自身process()方法完成網(wǎng)絡(luò)通信。注意:業(yè)務(wù)的process方法被調(diào)用又會(huì)觸發(fā)觀察者(即當(dāng)前service) 的update方法被調(diào)用,這使得剛才被處理掉的業(yè)務(wù)從隊(duì)列中被移除,并且開始處理下一條業(yè)務(wù); Ⅴ.EVENT_HANDLE_NEXT_PENDING_TRANSACTION ,這是一個(gè)多條彩信業(yè)務(wù)能夠 被 連續(xù) 處理的關(guān)鍵分支,首先在當(dāng)前service中有mProcessing數(shù)組列表用于緩存連續(xù)的彩信業(yè)務(wù),每條彩信業(yè)務(wù)是一個(gè)可被觀察的對象(注:觀察者模式 ), 當(dāng)前service是唯一觀察者,其會(huì)感知到一條業(yè)務(wù)已處理結(jié)束,并觸發(fā)下一條業(yè)務(wù)處理的開始; |
|