在短信中 SMSDispatcher 是短信的核心部分。 提供发送SMS等操作接口,同时也提供接收SMS和返回报告等接口。被集成到GSMPhone 中。
接收方面:
SMSDispatcher 启动时,会注册一些回调接口。
mCm.setOnNewSMS(this, EVENT_NEW_SMS, null); //新短信
mCm.setOnSmsStatus(this, EVENT_NEW_SMS_STATUS_REPORT, null);
有信的消息上来的时候:
SMSDispatcher 的消息处理函数 handleMessage 处理 EVENT_NEW_SMS 消息,其主要由dispatchMessage完成。
dispatchMessage() 【GSMSmsDispatcher.java】
1.如果是简单的不需要分条接收的短信, 则通过dispatchPdus()完成,并发送广播给
MMS应用中的PrivilegedSmsReceiver.java中。
接收到广播后, 调用了beingstartService() 启动 SmsReceiverService.java.
之后完成短信接收 存储等功能。
2.如果是需要分条接收的短信, 则dispathcher会调用processMessagePart() 函数进行操作。
其子短信有一个头部,里面包含一个结构体:
public static class ConcatRef {
public int refNumber; // 短信相关号1-255 相同的短信的子短信有相同的此号
public int seqNumber; // 短信编号
public int msgCount; // 分割成的得到短信条数
public boolean isEightBits;
}
收到子短信时,它会把短信暂时存储在一个mResolver, 等到收到了所有短信的时候,再将所有的短信取出拼接,而后删除暂存在mResolver 里面的子短信。 之后同样dispatchPdus() 调用,发送广播将pdus数据发送出去。
在启动了SmsReceiverService 之后, onStartCommand --> handleMessage -->handleSmsReceived。
在handleSmsReceived 中,通过getMessagesFromIntent(intent); (函数路径Telephony.java(frameworks\base\core\java\android\provider)) 对intent 中的pdu进行解析。获取到 相关信息, 及messageBody 信息内容。
SmsMessage[] msgs = Intents.getMessagesFromIntent(intent);然后insertMessage -->storeMessage; 结束。