android mms 广播,Android-如何成为第一个接收WAP PUSH(MMS)的人
這個話題似乎不太受歡迎!
我試圖自己回答這個問題,發(fā)現(xiàn)一些有趣的事情.
分析
SMS和MMS接收主要在文件InboundSmsHandler.java中進(jìn)行管理.
該文件以注釋塊開頭,該注釋塊解釋了SMS / MMS接收狀態(tài)機(jī).
這是此注釋的摘要,并帶有解釋:
>狀態(tài)機(jī)以InboundSmsHandler.IdleState狀態(tài)啟動.
>當(dāng)SMSDispatcher從無線電接收到新的SMS時,它將調(diào)用dispatchNormalMessage(com.android.internal.telephony.SmsMessageBase),該狀態(tài)將轉(zhuǎn)換為InboundSmsHandler.DeliveringState狀態(tài).
>從InboundSmsHandler.DeliveringState狀態(tài),調(diào)用processMessagePart(InboundSmsTracker tracker).在此方法中,如果SMS的目標(biāo)端口號是SmsHeader.PORT_WAP_PUSH(換句話說,如果SMS是MMS),則調(diào)用WapPushOverSms.dispatchWapPdu(byte [] pdu,BroadcastReceiver接收器,InboundSmsHandler處理程序)方法.
>在dispatchWapPdu方法內(nèi)部,它們調(diào)用InboundSmsHandler.dispatchIntent(意圖意圖,字符串許可權(quán),int appOp,BroadcastReceiver resultReceiver,UserHandle用戶).他們會檢查是否存在默認(rèn)的MMS應(yīng)用程序,如果是這樣,則將意圖配置為僅傳遞給該應(yīng)用程序.
碼:
// Direct the intent to only the default MMS app. If we can't find a default MMS app
// then sent it to all broadcast receivers.
ComponentName componentName = SmsApplication.getDefaultMmsApplication(mContext, true);
if (componentName != null) {
// Deliver MMS message only to this receiver
intent.setComponent(componentName);
if (DBG) Rlog.v(TAG, "Delivering MMS to: " + componentName.getPackageName() +
" " + componentName.getClassName());
}
handler.dispatchIntent(intent, permission, appOp, receiver, UserHandle.OWNER);
>在dispatchIntent內(nèi)部,我們有所需的內(nèi)容,即對Context.sendOrderedBroadcastAsUser(…)的調(diào)用.因此,正是這種方法將WAP_PUSH_DELIVER_ACTION廣播作為有序廣播發(fā)送.
>也通過位于InboundSmsHandler.java中的SmsBroadcastReceiver.onReceive(Context context,Intent intent)處理程序來處理此廣播(默認(rèn)應(yīng)用程序和SmsBroadcastReceiver).在此處理程序內(nèi)部,處理WAP_PUSH_DELIVER_ACTION案例.該意圖更改為WAP_PUSH_RECEIVED_ACTION,并通過InboundSmsHandler.dispatchIntent(意圖意圖,字符串權(quán)限,int appOp,BroadcastReceiver resultReceiver,UserHandle用戶)方法再次廣播.這次,不僅涉及默認(rèn)應(yīng)用程序,而且涉及所有感興趣的應(yīng)用程序.
碼:
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intents.SMS_FILTER_ACTION)) {
// ...
} else if (action.equals(Intents.SMS_DELIVER_ACTION)) {
// ...
} else if (action.equals(Intents.WAP_PUSH_DELIVER_ACTION)) {
// Now dispatch the notification only intent
intent.setAction(Intents.WAP_PUSH_RECEIVED_ACTION);
intent.setComponent(null);
// Only the primary user will receive notification of incoming mms.
// That app will do the actual downloading of the mms.
dispatchIntent(intent, android.Manifest.permission.RECEIVE_SMS,
AppOpsManager.OP_RECEIVE_SMS, this, UserHandle.OWNER);
} else {
// ...
}
}
結(jié)論(對原始問題的快速解答)
收到MMS時,首先將WAP_PUSH_DELIVER_ACTION廣播到默認(rèn)應(yīng)用程序,然后是WAP_PUSH_RECEIVED_ACTION.
兩種廣播都是有序廣播,這意味著可以使用優(yōu)先級.
好吧,這對我來說是個壞消息,因?yàn)檫@也意味著我不能成為第一個收到傳入MMS通知的人,并且在通知MMS應(yīng)用程序之前先打開模塊化數(shù)據(jù).
因此,我必須尋找另一種方式來做到這一點(diǎn).
總結(jié)
以上是生活随笔為你收集整理的android mms 广播,Android-如何成为第一个接收WAP PUSH(MMS)的人的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 简述python是怎么处理异常的-Pyt
- 下一篇: 辨析 const指针 和 指向常量的指针
