文档详情

Android短彩信收发流程

z****
实名认证
店铺
DOCX
658.24KB
约12页
文档ID:168684937
Android短彩信收发流程_第1页
1/12

Android 短彩信收发流程(应用层)下图为 ComposeMessageActivity 中 confirmSendMessageIfNeeded 部分的信息发送流程主要以 接收者有效性的确认为主,然后转向 sendMessage 方法进行发送撰笃'短/彩信内容结束JL收者收占翻if 足杏PJ见否仃无效 收吝晚认接收者有效性WXTO.COM弹出警告窗Ih代含尝试庚送与敦悄按刨bnjfflscndMcssagc刖警告窗「I, 貝包含取消按叨下图为 ComposeMessageActivity 中 confirmSendMessageIfNeeded 部分的信息发送流程主要以 接收者有效性的确认为主,然后转向sendMessage方法进行发送丿I瀚,茁中狀态饰小1滞 迫模式状恵—i&fll——、 「<?吨 U5(:佻 S SHE 胡 “1 i、』1 r.* 一/HTTP;//WWVkr, 2CTO.COM确认手肌状态有效性屯新添加接收壮 监听器谒川的朋nd移除接政書监听 器博入紧总理宣Activityf i ni sh()WorkingMessage.send从下图可以看出,在本方法中,对于不同类型的消息,分别调用不同的方法对其进行处理。

并 对彩信进行一些简要的预处理开始足吿为彩£杏Lt;c苦包 迖至拜h在新找程中调用 i; e ndH m aWo r'ko「览送获欣卩丽卩叶:ri汕1?广: 构谊 beidReqHTTPj/WWAr gCTO.C报掘-短/彩信区别凋 用相应方法滔为夥備聊认砂片 存在*将文基同歩到幻 灯片.移除氓门花题蔣搖改占处衣同步 ^IJinCruwrM^fit ■ on在菽线程屮调川 pTf?SfndSmsJnrker 发送»也箭接收皆缓存短信部分:WorkingMessage.preSendSmsWorker 如下图所示,这是短信部分的发送流程本方法中所涉及到的东西就比较多了由于已经转到 了新线程中利用 WorkingMessage 进行消息的发送,那么原来 ComposeMessage 中的那个 WorkingMessage 就可以更新了然后确认一下所属的会话是否存在,如果不存在就新建一 个接着,将接收者序列化,调用sendSmsWorker创建一个SmsMessageSender,将消息存入发 送队列中(type字段设为6)通知SmsReceiver发送SmsReceiver 则调用 SmsReceiverService 发送队列中的第一条短信。

在发送之前,还要根据卡的不同,将短信内容分成若干块,保证每块的大小不超过该卡的 限制在分段后的最后一条短信的sentIntent中,设置EXTRA_MESSAGE_SENT_SEND_NEXT为 true这样当短信发送成功后,会调用SmsReceiverService的handleSmsSent方法,发送队列中 的第一条然后,对每块都指定一个sentIntent,当发送出去之后,修改其状态若需要报告,还会指定 一个deliveryIntent,用于消息报告的处理这两个Intent都会被圭寸装到SmsTracker中,当发 送成功后,在SMSDispatcher的handleSendComplete中被取出sentIntent会被立即执行,将 消息状态转为已发送而deliveryIntent则会被加入deliveryPendingList,等收到消息报告后才 被执行(具体代码在不同的 dispatcher 中)发送完毕后,还要对短信上限、消息显示列表、草稿进行相应的处理序列化幾收占结束删除务余的瓶信. 确図不会趙过I:覘SmsReceiverService训月返冋取出疔疔处于舐列 中的刃誚息頁用第:綁息创建•个SmsSinglpRcci pi ontSendor .调用它的 scn d^cs sag i?调冃 scjitlSiiu-iWcii-kcrSjiisSingleRccipient Sender^JUSjnsHikuager 的 seridMul tipart Text Message发送:短f詳新鎚阳牛列诜川卜 存储发送报告和己 发送阳息擀总爲帯移勒发件M (type-4)将 ®fn 分段 < 底层采fflSmsMcssage的fragmcntTcxt). 在汁段后的衆厉爆更信的scntTntcnt'h-厦賢 EXTRA 5JESSAGE.SENT SEHD/FXT沖trueHTTPTWWVW 2CTC COI«调 /MCuinpu seife iSHgeAc ti vity 的 unMe$油屮卅utiI, ^1 MiLisi Adapter'kiJ有数拥■调用£〔ur训胡二stQuery史新通讪张和加閒ver发送洞息,Smg Ret? e i vgr 调用 c £? i v er $ f?r 忙 c e发 —送(Aetian^i ACTION SENT) MRS SAGE)调 H j Con ver sa t i t>n 的 ensurcThruadld 获取止^Threadld〔如果孩接枚痔列 农射应的会话不荷.①、您建)调用 Compos cMcs sage Ac t:'vi ty 的 on PrcHt、弓 $;ige Sent 对 Rbrk i n'gMp^^gG® 杼車 Ti:创程一个Sms \les JotgeSe n ©e r.调川 s ft i d* ssage发送消息SmsJlc ssagcSnndr r 将消 息存入衣.并密type(处丁队列■刖除该会话的草稿SmsReceiverService.handleSmsSent 消息发送后的处理当 sentIntent 被执行后,会根据不同的结果更新消息的所处信箱当有骑息发送出罢后,sent Intent会被调用,发-个广播给SmsReceiver (ActionMESSAGE.. SENT_ ACT I ON).然后转到SmsRece i verSe rviaey 交由 hand 1 eSmsSent 处现MessageStatusReceiver 消息报告当需要接收报告时,会在报告收到之后,在SMSDispatcher中根据不同类型从deliveryPendingList 中取出并执行相应的 deliveryIntent■^deli very Intent^调用时,会启幼 MessttgeS tatuaRcceiver 处理UXitl±ffTP://WWW. 2CTO.COM結束SmsReceiverService.handleSmsReceived 接收短信 当 RILReceiver 有消息收到时,会从 RIL 向上传递,经由 SMSDispatcher 的 dispatchPdus 方法生 成 Intent 调用 PrivilegedSmsReceiver。

为肓消息收到时* PrivilegedSmsRcceiv

每次调用的时候,先取出所有due_time在当前时间之前的待发送的彩信然后将它的Uri和 transactionType 封装到 TransactionBundle 中,传给 ServiceHandler类型设为EVENT_TRANSACTION_REQUEST在 ServiceHandler 中创建一个 SendTransaction 对象然后调 用processTransaction方法,根据当前Transaction是否已在队列中,以及当前的连接状态确定 该把这个SendTransaction对象放到哪个队列中(mPending为待发送,mProcessing为发送 中)同时使用 sendMessageDelayed 方法发送一个标记为 EVENT_CONTINUE_MMS_CONNECTIVITY 的 message 来保持连接接着,将 TransactionService 放入该 Transaction 对象的观察者列表,以便于在后面成功发送 后,继续发送待发送的彩信接下来,使用SendTransaction的Run方法从数据库中获取指定彩信,并构造SendReq,经由HttpUtils 发送编码后的彩信。

根据发送结果,选择是将错误状态存入数据库,还是将该彩信转 到已发送箱并通知Transactionservice处理待发送的彩信移至下-条彩f-根据 消息类则快氓传箍类则tnS u.f v i tcFLind 1 er创建SendTransact ionSciidTi-ans.Li.c Liun! f:始处理 i^T iLan s fir t i eg ijyJtJSendTransarr i onfVj h u w m却i射H JX Run方法使用 sendMcssagaDclayed*;' 期发送Message.雅持连接iiyj|JPduPer$'srerE^J[■ l ■ r nd i 1■■■ s $ h也联取duw Eime在当前f 时何上前的待炭送彩倍荻锻砒S电并创鎚rr'iii^acfionS^t'nfis榜给ni血rv 5曲h n“朗址即.* ^fi^T ransack-ion JjllAinFJroci?-A$itig将Transacxi onSflrvfepi川入该 Trati$acrianfi9液靈音列丧Tr-rLn$acr ianjjilAppend i neREQUEST STARTED设置并存入數据用O拥PHWI披SondReij-设程塩送讨同,将忡间更新到敕蚓彳i殳社 Tmti 湘 rti on 状态为成功览送将消忠移入已发件卷(msg hor=2)rLrcsp ST哎用发.送廿诃为本机号码>知 i^Trati sac t i on 的观探者.班而调用 TrahsautionService 的Lipdatf,V;'2;AKSetidi ngProg ressl'akeriWjritige r中饕餘该消息的吨辭flttpUtils^HtrpRsspunse 屮的數据转成Y 节数组井返回4Apdroi dH^tptl iwt 的l? x ? 1: 11 方iz< M送编码用的 卩止|并#;欣H r t u乩-勺加n的对喙--■设裁轍tpRequegr的屈件4£ii5endlnKErugresyTykeriManager^ 垠Ih⑴曲1 d井倜JI]sondPdu塩送(实何; 上是先确定-^latnse砾连魁丽用 HttpUti 也的 Ent 叽 QEirfeetion 境送 J£Ji£HirpHusT,TransactionService.update该方法执行后,先将 Transaction 从 mProcessing 列表中移除。

若 mPending 不空,说明有彩信 处于已基本处理但未发送状态,故调用mServiceHandler,设置EVENT_HANDLE_NEXT_PENDING_TRANSACTION 进行处理从 mPending 队列中取出第一个,交 由 processTransaction 处理由于在之前说过,调用 processTransaction 的 Transaction 都会被加 入 mProcessing 队列,而这个 Transaction 发送成功后,由会再次通知其观察者,进而调用 Transactionservice的update方法继续发送mPending队列中的信息故mPending队列中的彩 信会自动按顺序发完然后对于成功发送的消息,使用 Notification 通知用户(包括消息未读,消息报告等)并发 送 android.intent.action.TRANSACTION_COMPLETED_ACTION 的广播(目前该广播无人接收,应该 是为了支持应用开发人员而提供的一种广播)wStirv iccllaiidl t?r调用> .jj'uuesy ! -

当onReceive被调用后,让屏幕亮5 秒,然后创建一个ReceivePushTask并使用它的execute方法ReceivePushTask是一个 AsyncTask,实现了 dolnBackground 方法当传入 intent 后,会在 dolnBackground 中将其中的 数据转成GenericPdu,并根据其消息类型做出不同的操作如果是发送报告或已读报告,将其存入数据库如果是彩信通知,若已存在,则不处理否则将其存入数据库启动Transactionservice进行 处理Transactionservice中的处理主要是调用mServiceHandler,大体过程与发送彩信时相同,只是 此处创建的是 NotificationTransaction如果不支持自动下载或数据传输没打开,仅通知mmsc否则,下载相应彩信,删除彩信通 知,通知mmsc,删除超过容量限制的彩信,通知Transactionservice处理其余待发送的彩信幵始结魂-乩1LIHl習口动下苦允许数据传-竹删除趕过审址 現剧的恵信駅片卩是 存有滚it斯消息型■piT、「e£El『t i nnMintent 氓敢狷并购遇Generi t?Pdu斶Fdu數抜存入 數稠用唤酮辟卑片皆 亮廨l&TransactionScrvice 』|; \ ^Transact ion的 观察打利衣Lransaut Th;EnPcndinjjiiJc若沿IS rOXFTG 扣阳hl cdTran«Th ILpdu中没/j'^'KcontrntLocav'on,Pdu中Transact onTD^p-fr Acchntf'nTl.ocar-'a n(jipjjprrtvi"' 1 yR????isLiAj 忝 REQllFST STARTED'ReceivePushTaskIrans?irt i

下载提示
相关文档
正为您匹配相似的精品文档