Android2.3 短信接收 从 framework 到 MMS.apk 小记

     在短信中 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; 结束。

你可能感兴趣的:(Android2.3 短信接收 从 framework 到 MMS.apk 小记)