第二部分, Java代码

1.package简介:

Android中,telephony相关的java代码主要在下列目录中:

v
frameworks/base/telephony/java/android/telephony

提供Android telephony的公开接口,任何具有权限的第三方应用都可使用,如接口类TelephonyManager、SMSManager。

v
frameworks/base/telephony/java/com/android/internal/telephony

v
frameworks/base/services/java/com/android/server

提供一系列内部接口,目前第三方应用还不能使用。当前似乎只packages/apps/Phone能够使用.

v
packages/apps/Phone

目录packages/apps/Phone是一个特殊应用,或者理解为一个平台内部进程。其他应用通过intent方式调用这个进程的服务。

2.详细介绍

v
TelephonyManager(telephony/java/android/telephony/TelephonyManager.java)主要使用两个IBinder接口(AIDL接口)来访问telephony功能:

Ø
ITelephony, 提供与telephony进行操作,交互的接口,在packages/apps/Phone中由PhoneInterfaceManager.java实现。

Ø
ITelephonyRegistry,其提供一个通知机制,将一些底层状态或变更通知给电话服务的用户,如网络状态、信号强度等。它的服务实现在框架代码中,即:frameworks/base/services/java/com/android/server/TelephonyRegistry.java

底层通知的来源是GSMPhone/CDMAPhone通过PhoneNotifier接口的实现者DefaultPhoneNotifier将具体的事件转化为函数调用,通知到TelephonyRegistry。TelephonyRegistry再通过两种方式通知用户:

§
Broadcast机制广播事件;

§
通过服务用户在TelephonyRegistry.java中注册的IPhoneStateListener接口,实现回调机制。注册函数是用户可见的:

TelephonyManager.listen();

->TelephonyRegistry.listen(,IPhoneStateListener callback,,);

v
接口PhoneNotifier定义电话事件的通知方法

v
DefaultPhoneNotifier从PhoneNotifier派生而来。在其方法实现中,通过调用service ITelephonyRegistry来发布电话事件。

v
接口Phone描述了对电话的所有操作接口。 PhoneBase直接从Phone派生而来。而另外两个类,CDMAPhone和GSMPhone,又从PhoneBase派生而来,分别代表对CDMA和GSM的操作。

v
PhoneProxy也从Phone直接派生而来。当当前不需要区分具体是CDMA Phone还是GSMPhone时,可使用PhoneProxy。

备注:

PhoneApp创建时,

sPhoneNotifier = new DefaultPhoneNotifier();
...
sCommandsInterface = newRIL(context, networkMode, cdmaSubscription);然后根据当前phone是cdma还是gsm,创建对应的phone,如
sProxyPhone = newPhoneProxy(new GSMPhone(context,sCommandsInterface, sPhoneNotifier));


v
PhoneFactory.java: 获取电话实例,如GSMPhone/CDMAPhone.

PhoneFactory.makeDefaultPhones();

->PhoneFactory.makeDefaultPhone();//注册相应的Phone实例


->Phone phone = (Phone)PhoneFactory.getDefaultPhone();

v
接口IPhoneStateListener: 手机状态监听接口(AIDL),其服务实现在/frameworks/base/telephony/java/android/telephony/PhoneStateListener.java

v
接口CommandsInterface 描述了对电话的所有操作接口,如命令, 查询状态,以及电话事件监听等。

v
BaseCommands是CommandsInterface的直接派生类,实现了电话事件的处理(发送message给对应的handler)。

v
RIL又派生自BaseCommands。RIL负责实际实现CommandsInterface中的接口方法。RIL通过Socket和rild守护进程进行通讯。对于每一个命令接口方法,如acceptCall,或者状态查询,将它转换成对应的RIL_REQUEST_XXX,发送给rild。RIL中的几个类如下:

Ø
RILRequest:代表一个电话服务命令请求;

Ø
RIL.RILSender:负责处理命令的发送;

Ø
RIL.RELReceiver:负责处理命令相应以及主动上报信息的接受;线程RILReceiver监听socket,当有数据上报时,读取该数据并处理。读取的数据有两种。

§
电话事件,RIL_UNSOL_xxx, RIL读取相应数据后,发送message给对应的handler(详见函数processUnsolicited);

§
命令的异步响应。(详见函数processSolicited)

v
RILConstants.java : 定义了电话服务的具体命令。

v
抽象类Call代表一个call,有两个派生类CdmaCall和GsmCall。


更多相关文章

  1. android打电话发短信
  2. Android SDK 1.0 电话号码的例子(Demo)
  3. 怎么去掉联系人、通话记录、拨号列表界面中的电话号码中间的空格
  4. 【contacts】Phonebook电话本
  5. android 打电话
  6. android实现拨打电话
  7. Android Http通信(使用 标准Java接口)及解析Json
  8. Android广播接实现电话的监听(电话的状态,拦截)

随机推荐

  1. 探究Android(安卓)View 绘制流程,Canvas
  2. 谈谈你对Android(安卓)NDK的理解
  3. Android(安卓)Studio使用SimpleUMl插件导
  4. Android(安卓)focus search returned a v
  5. Android中Parcelable的使用详解
  6. Android(安卓)TV native层中Canvas库的实
  7. Android(安卓)复习巩固------ Animation
  8. 【Android(安卓)开发】:UI控件之 Progress
  9. Android引用方式
  10. NotificationCompat.Builder过时和通知显