android mms 广播,Android-如何成为第一个接收WAP PUSH(MMS)的人
這個話題似乎不太受歡迎!
我試圖自己回答這個問題,發(fā)現(xiàn)一些有趣的事情.
分析
SMS和MMS接收主要在文件InboundSmsHandler.java中進行管理.
該文件以注釋塊開頭,該注釋塊解釋了SMS / MMS接收狀態(tài)機.
這是此注釋的摘要,并帶有解釋:
>狀態(tài)機以InboundSmsHandler.IdleState狀態(tài)啟動.
>當SMSDispatcher從無線電接收到新的SMS時,它將調用dispatchNormalMessage(com.android.internal.telephony.SmsMessageBase),該狀態(tài)將轉換為InboundSmsHandler.DeliveringState狀態(tài).
>從InboundSmsHandler.DeliveringState狀態(tài),調用processMessagePart(InboundSmsTracker tracker).在此方法中,如果SMS的目標端口號是SmsHeader.PORT_WAP_PUSH(換句話說,如果SMS是MMS),則調用WapPushOverSms.dispatchWapPdu(byte [] pdu,BroadcastReceiver接收器,InboundSmsHandler處理程序)方法.
>在dispatchWapPdu方法內部,它們調用InboundSmsHandler.dispatchIntent(意圖意圖,字符串許可權,int appOp,BroadcastReceiver resultReceiver,UserHandle用戶).他們會檢查是否存在默認的MMS應用程序,如果是這樣,則將意圖配置為僅傳遞給該應用程序.
碼:
// 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內部,我們有所需的內容,即對Context.sendOrderedBroadcastAsUser(…)的調用.因此,正是這種方法將WAP_PUSH_DELIVER_ACTION廣播作為有序廣播發(fā)送.
>也通過位于InboundSmsHandler.java中的SmsBroadcastReceiver.onReceive(Context context,Intent intent)處理程序來處理此廣播(默認應用程序和SmsBroadcastReceiver).在此處理程序內部,處理WAP_PUSH_DELIVER_ACTION案例.該意圖更改為WAP_PUSH_RECEIVED_ACTION,并通過InboundSmsHandler.dispatchIntent(意圖意圖,字符串權限,int appOp,BroadcastReceiver resultReceiver,UserHandle用戶)方法再次廣播.這次,不僅涉及默認應用程序,而且涉及所有感興趣的應用程序.
碼:
@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 {
// ...
}
}
結論(對原始問題的快速解答)
收到MMS時,首先將WAP_PUSH_DELIVER_ACTION廣播到默認應用程序,然后是WAP_PUSH_RECEIVED_ACTION.
兩種廣播都是有序廣播,這意味著可以使用優(yōu)先級.
好吧,這對我來說是個壞消息,因為這也意味著我不能成為第一個收到傳入MMS通知的人,并且在通知MMS應用程序之前先打開模塊化數(shù)據(jù).
因此,我必須尋找另一種方式來做到這一點.
總結
以上是生活随笔為你收集整理的android mms 广播,Android-如何成为第一个接收WAP PUSH(MMS)的人的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简述python是怎么处理异常的-Pyt
- 下一篇: android无感刷新下拉分页,GitH