1. ITelephony接口和ISms接口以及AIDL
 在我们的Android应用中,当需要实现电话拨号时,我们需要进行如下调用
 ITelephony phone = (ITelephony)ITelephony.Stub.asInterface(ServiceManager.getService("phon"))
 phone.dial("10086");
对于短信应用,我们需要的是调用SmsManager,代码如下
SmsManager manager = SmsManager.getDefault();
manager.sendTextMessage("10086",null,"hi,this is sms",null,null);
这里,SmsManager对ISms做了一层包装,实质上是通过调用
ISms simISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
simISms.sendRawPdu....

  可以看到,应用都是采用AIDL来实现IPC的跨进程调度。
  对于AIDL应用,调用进程方存在的是一个实现接口的Proxy对象,通过Proxy对象与被调用进程中的Stub对象进行
  通讯来实现IPC的跨进程调度,所以,在被调用进程一端必定有一个ITelephony.Stub类以及ISms.Stub类的实现。

  2. PhoneInterfaceManager和SimSmsInterfaceManager
ITelephony.Stub 的实现类为com.android.phone.PhoneInterfaceManager
ISms.Stub的实现类为com.android.internal.telephony.gsm.SimSmsInterfaceManager
从这两个类的构造器的调用代码里可以很清楚的看到进行了Service的注册工作
ServiceManager.addService("phone",this);
ServiceManager.addService("isms",this);

  3. PhoneApp,InCallScreen,PhoneUtils及其他相关类
  从SimSmsInteferManager的相关方法实现中可以看到,具体就是调用GSMPhone的SmsDispatcher实例来进行相关操作的。
  从PhoneInterfaceManager会维持一个Phone对象的引用,当拨号应用时,PhoneInterfaceManager会将构造好的Intent传递
给PhoneApp应用,该Intent的className指定则为InCallScreen,从中我们可以看到InCallScreen具体是通过PhoneUtils调用Phone的
相关方法来实现。
  PhoneInterfaceManager怎么获取到对应的Phone对象,然后又怎么将Phone对象传递到InCallScreen中呢?
  具体这里涉及到了PhoneApp这个类,从这个类维护了一个 PhoneInterfaceManager的引用(phoneMgr)以及一个Phone引用(phone),
从该类的onCreate方法中我们可以清楚的看到,PhoneApp通过PhoneFactory获取了一个Phone实例,并通过该实例实现了PhoneInterfaceManager对象。
因此,我们现在只需要关注PhoneFactory具体提供的是一个什么样的Phone实例了。
  另外,PhoneApp类还提供了一个静态方法getInstance供InCallScreen调用,InCallScreen正是通过调用该方法获得PhoneApp实例从而
获得对应的Phone实例的。
  接下来,我们通过查看PhoneFactory的方法可以看到,Phone对象对应的就是一个GSMPhone实例。

  4。GSMPhone与RIL
  从GSM的构造器可以看出,他依赖一个CommandInterface接口实例,通过PhoneFactory的makeDefaultPhones方法,我们可以看到,根据系统环境变量
ro.radio.noril来判断是否需要采用RIL框架实现,如果该参数不为空,则采用Simultedcommands(主要是为了测试需要提供的模拟实现).否则,采用RIL。
  通过Google才知道,RIL其实是智能手机上实现AP与BP之间通信的一种设计思想,具体大家可以参见这篇文章http://www.eetchina.com/ARTICLES/2006OCT/PDF/CPCOL_2006OCT26_EMB_TA_170.PDF?SOURCES=DOWNLOAD
  在RIL.java 中我们很惊喜的看到,RIL对对消息的处理是将消息通过LocalSocket发送到以rild为名称的有名端口。这个有名Socket的创建在ril.cpp代码中。
  s_fdListen = android_get_control_socket(SOCKET_NAME_RIL)
  原来Android通话和发短信的应用是JAVA与C++代码之间透过Socket连接来传输消息来实现的。

  5.关于C代码与硬件之间的交互
  这部分工作其实就是C代码通过串口发送AT指令来拨号,收发短信。今天有点累了,具体的实现下次我再分析。

更多相关文章

  1. Android的ViewFlipper与GestureDetector
  2. Android仿美团分类下拉菜单实例代码
  3. Android:Deprecated Thread methods are not supported
  4. android ImageView实现圆角(xml实现方法)
  5. Android(安卓)生成和Pull解析xml
  6. 越过Android中布局文件中使用onClick属性的坑
  7. Android(安卓)复习_Service 一
  8. Android(安卓)keep screen on 方法
  9. Android打开系统相册的问题

随机推荐

  1. Android(安卓)获取通话记录
  2. android上传视频
  3. android执行Linux命令
  4. Android(安卓)4.0源码编译错误
  5. Android(安卓)监控网络状态
  6. Android(安卓)读写文件整理
  7. How to build Android(安卓)Windows SDK
  8. Android(安卓)沉浸式全屏(StatusBar,Navig
  9. Android(安卓)XUtils的cookie
  10. android 传感器