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短信发送过程(四)

更多相关文章

  1. android简单实现短信拦截
  2. Android(安卓)BroadcastReceiver
  3. Android通讯:短信
  4. Android客户端向服务器端发送数据的流程(1)
  5. Android系统中的广播(Broadcast)机制注册注销发送原理总结
  6. android & Linux uevent机制
  7. Android常用的几个命令
  8. 在测试环境模拟电话的进入和短信的进入
  9. Android中Intent的用法总结

随机推荐

  1. 关于android下audioflinger+alsa+a2dp+pc
  2. android bunlde简单使用
  3. Android(安卓)常用的Intent的URI及示例
  4. 2013年 Android开发环境安装
  5. Android(安卓)WebView 用法说明
  6. android java.lang.IllegalStateExceptio
  7. 多线程下载 附源码
  8. 【边做项目边学Android】手机安全卫士05_
  9. android的各种动作事件
  10. Android(安卓)自动化测试―robotium(七)Ant