本文主要讨论RILJ接收到一条普通短消息时是如何把它转换成Broadcast发送到系统中的。
一、GsmSMSDispatcher注册监听过程
在《 Framework层中的RIL》一文中我们介绍过,Framework与应用层中的Phone对象其实就是用GSMPhone对象生成的PhoneProxy对象(CDMA制式不谈)。 可以简单的理解为Phone就是GSMPhone对象。而GSMPhone又是Framework中与RIL层沟通的对象,因此我们从GSMPhone开始入手分析。
@GSMPhone.java
public GSMPhone (Context context, CommandsInterface ci, PhoneNotifier notifier, boolean unitTestMode) {
//调用父类PhoneBase的构造函数,在内部实现一下赋值:phone.mCM=ci=RILJ
super(notifier, context, ci, unitTestMode);
//初始化GsmSMSDispatcher,用于派发短消息
mSMS = new GsmSMSDispatcher(this, mSmsStorageMonitor, mSmsUsageMonitor);
}
上面看到,在GSMPhone的构造函数中,创建了GsmSMSDispatcher对象,这个对象是干什么用的呢?
其实在对SMS的处理上,不同的制式也有不同的处理方法, 与Phone对象类似,SMS同样抽象出来了一个SMSDispatcher类,他把各个制式对于SMS的处理中相同的部分抽象出来,而对于制式中不同的部分派生出了GsmSMSDispatcher子类和CdmaSMSDispatcher子类。
而我们主要关注GsmSMSDispatcher子类:
@GsmSMSDispatcher.java
public GsmSMSDispatcher(PhoneBase phone, SmsStorageMonitor storageMonitor, SmsUsageMonitor usageMonitor) {
super(phone, storageMonitor, usageMonitor);
mDataDownloadHandler = new UsimDataDownloadHandler(mCm);
//监测3个与SMS有关的状态
mCm.setOnNewGsmSms(this, EVENT_NEW_SMS, null);
mCm.setOnSmsStatus(this, EVENT_NEW_SMS_STATUS_REPORT, null);
mCm.setOnNewGsmBroadcastSms(this, EVENT_NEW_BROADCAST_SMS, null);
}
从上面可以看到,GsmSMSDispatcher的作用主要检测三种短消息事件。而上面的mCm是在其父类SMSDispatcher中进行初始化的: