您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 短信发送状态报告流程分析
短信发送状态报告流程分析//应用层分析:1.//SmsSingleRecipientSender.java2.publicbooleansendMessage(longtoken)throwsMmsException{3.if(mMessageText==null){4.//Don'ttrytosendanemptymessage,anddestinationshouldbejust5.//one.6.thrownewMmsException(Nullmessagebodyorhavemultipledestinations.);7.}8.SmsManagersmsManager=SmsManager.getDefault();9.ArrayListStringmessages=null;10.if((MmsConfig.getEmailGateway()!=null)&&11.(Mms.isEmailAddress(mDest)||MessageUtils.isAlias(mDest))){12.StringmsgText;13.msgText=mDest++mMessageText;14.mDest=MmsConfig.getEmailGateway();15.messages=smsManager.divideMessage(msgText);16.}else{17.messages=smsManager.divideMessage(mMessageText);18.//removespacesfromdestinationnumber(e.g.8015551212-8015551212)19.mDest=mDest.replaceAll(,);20.}21.intmessageCount=messages.size();22.23.if(messageCount==0){24.//Don'ttrytosendanemptymessage.25.thrownewMmsException(SmsMessageSender.sendMessage:divideMessagereturned+26.emptymessages.Originalmessageis\+mMessageText+\);27.}28.29.booleanmoved=Sms.moveMessageToFolder(mContext,mUri,Sms.MESSAGE_TYPE_OUTBOX,0);30.if(!moved){31.thrownewMmsException(SmsMessageSender.sendMessage:couldn'tmovemessage+32.tooutbox:+mUri);33.}34.35.ArrayListPendingIntentdeliveryIntents=newArrayListPendingIntent(messageCount);36.ArrayListPendingIntentsentIntents=newArrayListPendingIntent(messageCount);37.for(inti=0;imessageCount;i++){38.if(mRequestDeliveryReport){39.//TODO:Fix:Itshouldnotbenecessaryto40.//specifytheclassinthisintent.Doingthat41.//unnecessarilylimitscustomizability.42.deliveryIntents.add(PendingIntent.getBroadcast(//设置回执状态报告intent43.mContext,0,44.newIntent(45.MessageStatusReceiver.MESSAGE_STATUS_RECEIVED_ACTION,//底层发出的状态报告消息46.mUri,47.mContext,48.MessageStatusReceiver.class),//接收消息:MessageStatusReceiver.MESSAGE_STATUS_RECEIVED_ACTION,49.50.0));51.}52.Intentintent=newIntent(SmsReceiverService.MESSAGE_SENT_ACTION,53.mUri,54.mContext,55.SmsReceiver.class);56.57.intrequestCode=0;58.if(i==messageCount-1){59.//ChangingtherequestCodesothatadifferentpendingintent60.//iscreatedforthelastfragmentwith61.//EXTRA_MESSAGE_SENT_SEND_NEXTsettotrue.62.requestCode=1;63.intent.putExtra(SmsReceiverService.EXTRA_MESSAGE_SENT_SEND_NEXT,true);64.}65.sentIntents.add(PendingIntent.getBroadcast(mContext,requestCode,intent,0));66.}67.try{68.smsManager.sendMultipartTextMessage(mDest,mServiceCenter,messages,sentIntents,deliveryIntents/*在下发短信时设置deliveryIntents*/);//注意此处69.}catch(Exceptionex){70.thrownewMmsException(SmsMessageSender.sendMessage:caught+ex+71.fromSmsManager.sendTextMessage());72.}73.if(Log.isLoggable(LogTag.TRANSACTION,Log.VERBOSE)){74.log(sendMessage:address=+mDest+,threadId=+mThreadId+75.,uri=+mUri+,msgs.count=+messageCount);76.}77.returnfalse;78.}79.80.//应用层接收短信状态信息,并更新数据库81.//MessageStatusReceiver.java82.publicvoidonReceive(Contextcontext,Intentintent){83.mContext=context;84.if(MESSAGE_STATUS_RECEIVED_ACTION.equals(intent.getAction())){85.86.UrimessageUri=intent.getData();87.byte[]pdu=(byte[])intent.getExtra(pdu);88.89.SmsMessagemessage=updateMessageStatus(context,messageUri,pdu);//更新短信状态:数据库SMS表status字段,状态报告取值:90./*STATUS_NONE=-1;91.STATUS_COMPLETE=0;92.STATUS_PENDING=32;93.STATUS_FAILED=64;94.*/95.96.//CalledontheUIthreadsodon'tblock.97.if(message.getStatus()Sms.STATUS_PENDING)98.MessagingNotification.nonBlockingUpdateNewMessageIndicator(context,99.true,message.isStatusReportMessage());100.}101.}102.103.//框架层分析:104.//SMSDispatcher.java105.106.@Override107.publicvoidhandleMessage(Messagemsg){108.AsyncResultar;109.110.switch(msg.what){111.caseEVENT_NEW_SMS_STATUS_REPORT:112.handleStatusReport((AsyncResult)msg.obj);//转到派生类GsmSMSDispatcher.java中处理113.break;114.115.}116.}117.118.//GsmSMSDispatcher.java119.@Override120.protectedvoidhandleStatusReport(AsyncResultar){121.StringpduString=(String)ar.result;122.SmsMessagesms=SmsMessage.newFromCDS(pduString);123.124.inttpStatus=sms.getStatus();125.126.if(sms!=null){127.intmessageRef=sms.messageRef;128.for(inti=0,count=deliveryPendingList.size();icount;i++){129.//deliveryPendingList定义在父类SMSDispatcher.java中,并在handleSendComplete函数里对每个短信发送完成后获取状态信息:130./*if(tracker.mDeliveryIntent!=null){131.//Expectingastatusreport.Addittothelist.132.intmessageRef=((SmsResponse)ar.result).messageRef;133.tracker.mMessageRef=messageRef;134.deliveryPendingList.add(tracker);135.}*/136.//137.SmsTrackertracker=deliveryPendingList.get(i);138.if(tracker.mMessageRef==messageRef){139.//Foundit.Removefromlistandbroadcast.140.if(tpStatus=Sms.STATUS_FAILED||tpStatusSms.STATUS_PENDING){141.deliveryPendingList.remove(i);142.}143.PendingIntentintent=tracker.mDeliveryIntent;144.IntentfillIn=newIntent();145.fillIn.putExtra(pdu,IccUtils.hexStringToBytes(pduString));146.fillIn.putExtra(encoding,getEncoding());147.try{148.intent.send(mContext,Activity.RESULT_OK,fillIn);149.}catch(CanceledExceptionex){}150.151.//Onlyexpecttoseeonetrackermatchingthismessageref152.break;153.}154.}155.}156.acknowledgeLastIncomingSms(true,Intents.RESULT_SMS_HANDLED,null);157.}
本文标题:短信发送状态报告流程分析
链接地址:https://www.777doc.com/doc-2175365 .html