androidのMMS短信发送过程(三)

                                                                           androidのMMS短信发送过程(三)

1. 继短信发送过程二

MessageSender sender = new SmsMessageSender(mActivity, dests, msgText, threadId);
sender.sendMessage(threadId);


看下本篇讲的主类 SmsMessageSender. java
----> class SmsMessageSender implements MessageSender
在类 SmsMessageSender 中,会看到sendMessage方法。

public boolean sendMessage(long token) throws MmsException {
        return queueMessage(token);
}
private boolean queueMessage(long token) throws MmsException {
        MmsLog.v(MmsApp.TXN_TAG, "queueMessage()");  
        if ((mMessageText == null) || mMessageText.isEmpty() || (mNumberOfDests == 0)) { //这里log不走
            // Don't try to send an empty message.
            throw new MmsException("Null message body or dest.");
        }
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); //判断是否开启发送报告
        /// M:Code analyze 002, add for gemini to make sure if request delivery or not @{
        boolean requestDeliveryReport = false;
        if (EncapsulatedFeatureOption.MTK_GEMINI_SUPPORT) { //是否支持双卡
            requestDeliveryReport = prefs.getBoolean(Integer.toString(mSimId) + "_" + //判断true/false
                SmsPreferenceActivity.SMS_DELIVERY_REPORT_MODE,
                DEFAULT_DELIVERY_REPORT_MODE);
        } else {
            requestDeliveryReport = prefs.getBoolean(
                SmsPreferenceActivity.SMS_DELIVERY_REPORT_MODE,
                DEFAULT_DELIVERY_REPORT_MODE);
        }
        MmsLog.d(MmsApp.TXN_TAG, "SMS DR request=" + requestDeliveryReport);
        long timeStamp = System.currentTimeMillis();
        for (int i = 0; i < mNumberOfDests; i++) {  //一下对每个接受者发送短信
            try {
                .......
                if (smsUri == null) {
                    /// M:Code analyze 003, add for gemini,add message to specific uri @{
                    if (EncapsulatedFeatureOption.MTK_GEMINI_SUPPORT) {
                     ..........
                    } else {
                        EncapsulatedTelephony.Sms.addMessageToUri(mContext.getContentResolver(),
                            Uri.parse("content://sms/queued"), mDests[i],
                            mMessageText, null, mTimestamp,
                            true /* read */,
                            requestDeliveryReport,
                            mThreadId,
                            mSimId);
                    }
                }
            } catch (SQLiteException e) {
                if (LogTag.DEBUG_SEND) {
                    Log.e(TAG, "queueMessage SQLiteException", e);
                }
                SqliteWrapper.checkSQLiteException(mContext, e);
            }
        }
        Intent sentIt = new Intent(SmsReceiverService.ACTION_SEND_MESSAGE, null, mContext,  //发送广播
                SmsReceiver.class);
        sentIt.putExtra(EncapsulatedPhone.GEMINI_SIM_ID_KEY, mSimId);
        mContext.sendBroadcast(sentIt);
        return false;
    }

SmsMessageSender的主要任务就是,把信息进行按收信人拆分,也就是说,短信是要给每个收信人都发一封,虽然你可能只编辑一个短信,但是当收信人不只一个时,就变成了多条短信,就要发出多条短信,要给每一个收信人都发一封短信。


2. SmsMessageSender任务归纳:
(1) 分析收信人地址,得到收信人的个数,
(2) 然后把信息按每个收信人都放入待发送的队列中。这样就得到了一个短信发送队列,短信的数目就是收信人的个数
(3) 它会发送Intent唤起SmsReceiverService来处理队列,它的工作就完成了,sendMessage()也就此返回


3. 事实上,SmsMessageSender的工作仅此而已,当把信息都放入发送队列后也就是写进数据库,然后信息的状态是正在发送中,。SmsMessageSender的sendMessage()返回后,WorkingMessage会再次回调UI的接口,因为此时短信已被写入数据库,所以UI会刷新信息列表,显示刚刚的短信,这时的状态应该是正在发送中,因为是从待发送队列中拿到的。从这以后,发送流程的类不会再直接与UI进行通信,发送服务SmsReceiverService等会直接更新数据库中短信的状态,而UI会监听数据库的变化,一旦信息数据发生变化,UI就会刷新列表中的消息,更新状态,比如将发送中变成已发送,或是标明发送失败等,而这些状态都是发送服务在更新。


4. 关键字搜索:
V/Mms/Txn ( 2225): queueMessage()
D/Mms/Txn ( 2225): SMS DR request=false


此时看到该方法中发送了一个广播,SmsReceiver.class 短消息广播接收器。
下文待续 androidのMMS短信发送过程(四)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值