4, 多收件人发送
和长短信发送类似, 多收件人发送也是逐条发送, 不同的是, 多收件人发送是一条短信发送完成之后才发送另外一条。
在第二章的最后, 一条短信发送完成之后, 最后会调用 SMSDispatcher 的 handleSendComplete 方法, 主要是根据发送的
结果分别进行处理, 主要逻辑如下,
1, 首先获取发送结果和 intent,
- SmsTracker tracker = (SmsTracker) ar.userObj;PendingIntent sentIntent = tracker.mSentIntent;
2, 如果短信发送成功, 调用 SmsTracker 的 onSent 方法,
- tracker.onSent(mContext);
3, 如果短信发送成功, 调用 SmsTracker 的 onFailed 方法,
- tracker.onFailed(mContext, error, errorCode);
SmsTracker 是 SMSDispatcher 的内部类, 其 onSent 方法逻辑如下,
1, 判断是否已经将长短新最后一条发送完毕
- boolean isSinglePartOrLastPart = true;if (mUnsentPartCount != null) { isSinglePartOrLastPart = mUnsentPartCount.decrementAndGet() == 0;}
2, 如果当前所有短信发送完毕,更新数据库状态
- if (isSinglePartOrLastPart) { int messageType = Sms.MESSAGE_TYPE_SENT; if (mAnyPartFailed != null && mAnyPartFailed.get()) { messageType = Sms.MESSAGE_TYPE_FAILED; } persistOrUpdateMessage(context, messageType, 0/*errorCode*/);}
3, 取出短信中的 intent, 通知短信已经发送成功,
- if (mSentIntent != null) { try { // Extra information to send with the sent intent Intent fillIn = new Intent(); if (mMessageUri != null) { // Pass this to SMS apps so that they know where it is stored fillIn.putExtra("uri", mMessageUri.toString()); } if (mUnsentPartCount != null && isSinglePartOrLastPart) { // Is multipart and last part fillIn.putExtra(SEND_NEXT_MSG_EXTRA, true); } mSentIntent.send(context, Activity.RESULT_OK, fillIn); } catch (CanceledException ex) { Rlog.e(TAG, "Failed to send result"); }}
由于此时无论是长短信还是普通短信,都已经发送完毕(只发送了一个收件人),因此 isSinglePartOrLastPart 的判定将会是 true,
从而更新数据库中该短信的状态,然后再将发送时附加在 SmsTracker 中的 mSentIntent 取出来并调用 PendingIntent 的 send 方法
发送出去,同时指定返回结果为 "Activity.RESULT_OK"。
当然, 这些 intent 是短信发送时, 在 SmsSingleRecipientSender 的 sendMessage 方法中填入的, 代码如下,
- Intent intent = new Intent(SmsReceiverService.MESSAGE_SENT_ACTION, mUri, mContext, SmsReceiver.class);
由于 SmsReceiver 会把所有 Intent 转交给 SmsReceiverService 处理, SmsReceiverService 的 handleMessage 方法对
MESSAGE_SENT_ACTION 处理如下,
- if (MESSAGE_SENT_ACTION.equals(intent.getAction())) { handleSmsSent(intent, error);
调用 handleSmsSent 方法, 该方法逻辑如下,
- Uri uri = intent.getData();mSending = false;boolean sendNextMsg = intent.getBooleanExtra(EXTRA_MESSAGE_SENT_SEND_NEXT, false);// 表示是否是长短新的最后一条???if (mResultCode == Activity.RESULT_OK) {//上一条短信发送成功???//将已经发送成功的短信移入发件箱,更新其状态为已发送 if (!Sms.moveMessageToFolder(this, uri, Sms.MESSAGE_TYPE_SENT, error)) { Log.e(TAG, "handleSmsSent: failed to move message " + uri + " to sent folder"); } if (sendNextMsg) { //继续发送短信给其他收件人 sendFirstQueuedMessage();}???
主要看最后的 sendFirstQueuedMessage 方法, 继续发送短信给其他收件人。当然, 这个方法的详细调用流程在前面已经论述过。
由此, 多收件人就是将短信逐个发送给收件人, 无论上一个人是否发送成功, 不影响将短信发送给下一个人。
来源: http://www.92to.com/bangong/2017/08-17/27110694.html