首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

短信发送流程-应用层

2012-09-08 
短信发送流程--应用层短信发送流程应用层解析1、涉及的类说明:从ui界面开始,到调用中间层SmsManger的方法发

短信发送流程--应用层
短信发送流程应用层解析1、涉及的类

说明:从ui界面开始,到调用中间层SmsManger的方法发送短信,大致时序就是这样,参考代码是android 2.3
3、流程解析3.1 ComposeMessageActivity工作

该类是我们编辑短信的UI,与用户交互,如下图所示

短信发送流程-应用层

当用户编辑完成,即可点击发送的按钮,将短信内容发送出去,点击sendbutton就会触发该button对应的监听器,由于ComposeMessageActivity实现了OnClickListener接口,所以最终调用到了onclick方法里。

1)onClick分析

   该方法做了两件件事情:

    一是调用isPreparedForSending方法判断当前短信是否准备发送,依据就是短信短信的接收者是否超过允许的上限,是否有接收者,以及短信是否有内容或者附件、主题之类的,不允许用户发送一条什么都没有的短信出去。

   二是,上面的检查通过调用confirmSendMessageIfNeeded方法开始发送流程。当然并不是调用了该方法就一定能发送成功,该方法同样会做一系列的检查,直到符合要求了才会放行。

2)confirmSendMessageIfNeeded分析 

该方法的逻辑调用如下图所示:

短信发送流程-应用层

3)sendMessage方法分析上图可以看出最后都要走到sendMessage来,我们来看看这个方法到底做了哪些工作。通过查看代码我们可以发现最最核心的工作就是: 把发送短信的工作交给WorkingMessage,mWorkingMessage.send(mDebugRecipients);其他的工作也仅仅是做一些辅助型的操作。小结:到此为止发送短信的工作交给了WorkingMessage,那ComposeMessageActivity主要的工作即是对双卡的处理。3.2 WorkingMessage简单分析1)send()分析该方法做了五项工作:一是  检查接收者列表时否为空,这里我就不做具体的分析。二是将短信内容从8字节转换成7字节;三是判断当前是否是发送彩信,我们当前是短信发送,所以可定不会走彩信的发送流程。四是,将短信的签名加到短信的内容上。五是调用preSendSmsWorker()方法。2)preSendSmsWorker分析一是重置界面,将界面上的各个组件全部清除二是调用sendSmsWorker方法三是删除草稿。3)sendSmsWorker()所做的工作调用SmsMessageSender的sendMessage()方法
3.3 SmsMessageSender简析1)sendMessage()

该方法会调用queueMessage()方法把处理发送的任务抛出去。

2)queueMessage()它的职责有两个:一是将要发送的短息保存到数据库;
if (mMessageText == null) {            // Don't try to send an empty message, and destination should be just            // one.            throw new MmsException("Null message body or have multiple destinations.");        }        SmsManager smsManager = SmsManager.getDefault();        ArrayList<String> messages = null;        if ((MmsConfig.getEmailGateway() != null) &&                (Mms.isEmailAddress(mDest) || MessageUtils.isAlias(mDest))) {            String msgText;            msgText = mDest + " " + mMessageText;            mDest = MmsConfig.getEmailGateway();            messages = smsManager.divideMessage(msgText);        } else {           messages = smsManager.divideMessage(mMessageText);           // remove spaces from destination number (e.g. "801 555 1212" -> "8015551212")           mDest = mDest.replaceAll(" ", "");        }        int messageCount = messages.size();        if (messageCount == 0) {            // Don't try to send an empty message.            throw new MmsException("SmsMessageSender.sendMessage: divideMessage returned " +                    "empty messages. Original message is \"" + mMessageText + "\"");        }        boolean moved = Sms.moveMessageToFolder(mContext, mUri, Sms.MESSAGE_TYPE_OUTBOX, 0);        if (!moved) {            throw new MmsException("SmsMessageSender.sendMessage: couldn't move message " +                    "to outbox: " + mUri);        }        ArrayList<PendingIntent> deliveryIntents =  new ArrayList<PendingIntent>(messageCount);        ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(messageCount);        for (int i = 0; i < messageCount; i++) {            if (mRequestDeliveryReport) {                // TODO: Fix: It should not be necessary to                // specify the class in this intent.  Doing that                // unnecessarily limits customizability.                deliveryIntents.add(PendingIntent.getBroadcast(                        mContext, 0,                        new Intent(                                MessageStatusReceiver.MESSAGE_STATUS_RECEIVED_ACTION,                                mUri,                                mContext,                                MessageStatusReceiver.class),                        0));            }            Intent intent  = new Intent(SmsReceiverService.MESSAGE_SENT_ACTION,                    mUri,                    mContext,                    SmsReceiver.class);            int requestCode = 0;            if (i == messageCount -1) {                // Changing the requestCode so that a different pending intent                // is created for the last fragment with                // EXTRA_MESSAGE_SENT_SEND_NEXT set to true.                requestCode = 1;                intent.putExtra(SmsReceiverService.EXTRA_MESSAGE_SENT_SEND_NEXT, true);                intent.putExtra(SUBSCRIPTION, mSubscription);            }            sentIntents.add(PendingIntent.getBroadcast(mContext, requestCode, intent, 0));        }        try {            smsManager.sendMultipartTextMessage(mDest, mServiceCenter, messages, sentIntents,                       deliveryIntents, mSubscription);        } catch (Exception ex) {            throw new MmsException("SmsMessageSender.sendMessage: caught " + ex +                    " from SmsManager.sendTextMessage()");        }        if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {            log("sendMessage: address=" + mDest + ", threadId=" + mThreadId +                    ", uri=" + mUri + ", msgs.count=" + messageCount);        }

4、总结

 这部分主要是分析了短息的发送的一个流程,从ui点击button开始到中间层执行发送的操作,当然这里还有很多不详的地方,我也在尝试不断的完善。



热点排行