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