Android4.2
在Android4.0中,Phone应用的Application类PhoneApp的onCreate方法中调用了
PhoneFactory.makeDefaultPhones(this);
而在4.2中此方法被移到了PhoneGlobals中,PhoneGlobals类继承自ContextWrapper。
在PhoneFactory的makeDefaultPhone方法中初始化了RIL类的静态对象sCommandsInterface与Phone的静态对象sProxyPhone。
RIL构造时判断出手机网络良好就会启动一个线程,线程的Runnable对象是RILReceiver的对象。在run方法中构建Sockect并向下层发起连接
s = new LocalSocket();
l = new LocalSocketAddress(SOCKET_NAME_RIL,
LocalSocketAddress.Namespace.RESERVED);
s.connect(l);
如果连接不上每隔4秒重连一次。如果连接正常,则获取流,调用readRilMessage(is, buffer)方法返回除去开头4个字节外能从流中获取的字节数并把获取的字节存于8k大小限制的buffer中,如果读不到任何字节返回-1。如果返回值为-1,则跳出处理流程,重新进入for循环,否则把获取的字节存于Parcel对象中并调用processResponse(p)处理获取到的数据。
private void
processResponse (Parcel p) {
int type;
type = p.readInt();
if (type == RESPONSE_UNSOLICITED) {
processUnsolicited (p);
} else if (type == RESPONSE_SOLICITED) {
processSolicited (p);
}
releaseWakeLockIfDone();
}
接下来读取4个代表类型的字节。走if流程processUnsolicited (p)。
接下来再读取4个字节的int数据代表事件类型,接收短信走RIL_UNSOL_RESPONSE_NEW_SMS(1003)