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方法,继续发送短信给其他收件人。当然,这个方法的详细调用流程在前面已经论述过。
由此,多收件人就是将短信逐个发送给收件人,无论上一个人是否发送成功,不影响将短信发送给下一个人。