您现在的位置:首页 > 信息与通信 >

Android短彩信收发流程(应用层)_图文


短彩信收发流程(应用层) Android 短彩信收发流程(应用层)
下图为 ComposeMessageActivity 中 confirmSendMessageIfNeeded 部分的信息发送流程。主要以 接收者有效性的确认为主,然后转向 sendMessage 方法进行发送。

下图为 ComposeMessageActivity 中 confirmSendMessageIfNeeded 部分的信息发送流程。主要以 接收者有效性的确认为主,然后转向 sendMessage 方法进行发送。

WorkingMessage.send 从下图可以看出,在本方法中,对于不同类型的消息,分别调用不同的方法对其进行处理。并 对彩信进行一些简要的预处理。

短信部分: 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 中)。 发送完毕后,还要对短信上限、消息显示列表、草稿进行相应的处理。

SmsReceiverService.handleSmsSent 消息发送后的处理 当 sentIntent 被执行后,会根据不同的结果更新消息的所处信箱

MessageStatusReceiver 消息报告 当需要接收报告时,会在报告收到之后,在 SMSDispatcher 中根据不同类型手机从 deliveryPendingList 中取出并执行相应的 deliveryIntent

SmsReceiverService.handleSmsReceived 接收短信 当 RILReceiver 有消息收到时,会从 RIL 向上传递,经由 SMSDispatcher 的 dispatchPdus 方法生 成 Intent 调用 PrivilegedSmsReceiver。

彩信部分: WorkingMessage.sendMmsWorker 从下图可以看出,彩信发送的过程和短信过程有些类似。都需要重置 WorkingMessage,获取 实际 ThreadId。发送完都要删除多余的信息,调用 ComposeMessageActivity 的 onMessageSent。 只是彩信没另外创建一个类似 preSendSmsWorker 的方法,而是把所有内容都放在 sendMmsWorker 中处理。同时,删除草稿的位置也有所不同。

TransactionService.onStartCommand 彩信的发送与短信不同,是以网络的方式发送的。 每次调用的时候,先取出所有 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 处理待发送的彩信。

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 的广播(目前该广播无人接收,应该 是为了支持应用开发人员而提供的一种广播)。

PushReceiver android 的彩信接收应用层部分从 PushReceiver 开始。当 onReceive 被调用后,让屏幕亮 5 秒, 然后创建一个 ReceivePushTask 并使用它的 execute 方法。ReceivePushTask 是一个 AsyncTask, 实现了 doInBackground 方法。当传入 intent 后,会在 doInBackground 中将其中的数据转成 GenericPdu,并根据其消息类型做出不同的操作。

如果是发送报告或已读报告,将其存入数据库。 如果是彩信通知,若已存在,则不处理。否则将其存入数据库。启动 TransactionService 进行 处理。 TransactionService 中的处理主要是调用 mServiceHandler,大体过程与发送彩信时相同,只是 此处创建的是 NotificationTransaction。 如果不支持自动下载或数据传输没打开,仅通知 mmsc。否则,下载相应彩信,删除彩信通知, 通知 mmsc,删除超过容量限制的彩信,通知 TransactionService 处理其余待发送的彩信

http://www.2cto.com/kf/201111/109802.html



热文推荐
友情链接: 简历 面试求职范文 职业规划 自我管理 社交礼仪 76242百科