发送过程是分短信和彩信写的,接收过程就写到一起了。至于原因还是从收彩信的流程说起,收彩信时要先收彩信通知,然后再根据通知里的地址再去获取彩信内容,而彩信通知是通过RIL传过来的,其实彩信通知就是一条短信,特别之处这个短信是带端口的。所以收短信和收彩信在最开始时候走的代码是一样的,还是开始看代码吧,
从RIL.java开始,收到从模块报上来的消息,这里还不知道是短信还是彩信,newFromCMT()方法先处理下。
case RIL_UNSOL_RESPONSE_NEW_SMS: { if (RILJ_LOGD) unsljLog(response); String a[] = new String[2]; a[1] = (String)ret; SmsMessage sms; sms = SmsMessage.newFromCMT(a);//注意这里,其实如果是短信,在这解码已经结束了,看接下来给出来的两段代码。 if (mGsmSmsRegistrant != null) { mGsmSmsRegistrant.notifyRegistrant(new AsyncResult(null, sms, null));//要注意这里,不然会迷路。 } public static SmsMessage newFromCMT(String[] lines) { try { SmsMessage msg = new SmsMessage(); msg.parsePdu(IccUtils.hexStringToBytes(lines[1]));//先解码了一些信息,时间、短信中心、编码方式等,这里还是当短信处理的 return msg; } catch (RuntimeException ex) { Log.e(LOG_TAG, "SMS PDU parsing failed: ", ex); return null; } } private void parsePdu(byte[] pdu) { mPdu = pdu; PduParser p = new PduParser(pdu); scAddress = p.getSCAddress(); if (scAddress != null) { if (false) Log.d(LOG_TAG, "SMS SC address: " + scAddress); } int firstByte = p.getByte(); mti = firstByte & 0x3; switch (mti) { case 0: case 3: parseSmsDeliver(p, firstByte);//收到的短信 break; case 2: parseSmsStatusReport(p, firstByte);//短信状态报告 break; default: throw new RuntimeException("Unsupported message type"); }接下来就是来到SmsDispather.java的handleMessage()方法的 case EVENT_NEW_SMS分支,至于为什么就要看明白 mGsmSmsRegistrant.notifyRegistrant(new AsyncResult(null, sms, null))这段代码的原理了。在handleMessage()方法有个handleMessage()方法,具体实现看子类GsmSMSDispatcher.java的handleMessage()方法,这里短信和彩信要根据端口号的不同分开了,带端口的是彩信通知