SMS 发送流程

来源:互联网 发布:app源码 编辑:程序博客网 时间:2024/05/28 11:28

com.android.mms不管做了怎么复杂的数据包存或者什么逻辑处理,最终还是调用到了SmsManager的sendMultipartTextMessage方法中。该方法是发送多媒体短信(彩信)用的,当参数 ArrayList parts的大小不大于1时,SmsManager将默认改为sendTextMessage方式发送,即以普通短信信息发送。而不管那种方式发送都会通过一个ISms的接口进行发送,获得这个接口的方法为:
ISms iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms")); 在com.android.internal.telephony.IccSmsInterfaceManagerProxy.java 中可以很清晰的看到ServiceManager.addService("isms", this)的系统服务注册方法。同时在这个类中也有对ISms的接口实现。跟短信发送相关的是 public void sendText(String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) 以及 public void sendMultipartText(String destAddr, String scAddr, List parts, List sentIntents, List deliveryIntents) 在初始化IccSmsInterfaceManagerProxy的时候会传入一个IccSmsInterfaceManager的对象,这个对象将是真正实现上面2个方法的对象。在IccSmsInterfaceManager中经过权限的判定以及其他一些逻辑判断之后,会将所有参数传递给SMSDispatcher类进行短信的分发。而这个类是一个抽象类,对于这个抽象类的实现分别是CdmaSMSDispatcher以及GsmSMSDispatcher,很明显这是因为网络类型的不同短信的发送也会有一定的差异。我们以Gsm网络为例,继续向下跟踪。在GsmSMSDispatcher中,调用SmsMessage中的getSubmitPdu将从界面上一路传递下来的信息封装成PDU。封装PUD就比较复杂了,但是这也是短信发送的一个核心部分。首先封装头部数据,调用getSubmitPduHead方法,在这个方法中系统会将SMSC(短信服务中心)以及被叫地址等相关信息都准备好。之后开始对短信内容开始编码,如果此时没有指定编码格式,则以7-bit方式编码否则使用UCS2方式编码,如果7-bit编码过程中失败,则使用UCS2进行编码。之后将编码的结果以byte数组的方式保存在SubmitPdu中。之后调用sendRawPdu方法进行发送,此时还并不是最终的发送,在sendRawPdu中再经过一些状态,参数合法性的判断,准备一个触发消息体(android惯用伎俩)之后调用sendSMS进行真正的发送,而这个发送则是在RIL里面完成。

原创粉丝点击