多收件人发送流程分析

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方法,继续发送短信给其他收件人。当然,这个方法的详细调用流程在前面已经论述过。

由此,多收件人就是将短信逐个发送给收件人,无论上一个人是否发送成功,不影响将短信发送给下一个人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值