Android RIL源码分析(2)

第二部分, 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。


你可能感兴趣的:(Android RIL源码分析(2))