InCallService
里面有一个InCallServiceBinder extends IInCallService.Stub,在onBind中会返回这个内部类的实例。
里面有一个mPhone实例,InCallService里面的一些设置,如下,都是对这个mPhone相关函数的包装。
同时这个InCallService里面还有一个空函数,是由继承它的子类来实现,比如InCallServiceImpl。里面还有VideoCall抽象类,以及这个抽象类里面的Callback内部抽象类(抽象类内部的抽象类,好拗口啊!)
而且InCallService里面还定义了一个mPhoneListener,且将该实例添加到了mPhone的监听列表里面。而在mPhone里面有很多地方都会触发注册在其列表中的Listener。
感悟:其实日常我们看Service之类的,需要重点记住它的框架,以及声明周期内的调用次序。这样我们下次在填充这个框架的时候就不会迷失在过多的代码细节中了。
小知识:
/** Enum indicating multisim variants
* DSDS - Dual SIM Dual Standby
* DSDA - Dual SIM Dual Active
* TSTS - Triple SIM Triple Standby
**/
/** @hide */
public enum MultiSimVariants {
DSDS,
DSDA,
TSTS,
UNKNOWN
};
DSDA:Dual SIM dual active,即双卡双通;
DSDS:Dual SIM dual standy,即双卡双待;
双卡双通就是可以2个号码同时拨通并可以同时通话的。双卡双待双通是指一部手机同时接通来自两个通信网络的信号(通过放两张卡),这是中国手机产业对全球移动通信行业的贡献。
RIL
RIL.java里面包含RILRequest和RIL,以及RIL的两个内部类:RILSender和RILReceiver。
我们先看看RIL的类型继承关系:
//RIL.java
public final class RIL extends BaseCommands implements CommandsInterface {
BaseCommands
其实BaseCommands也是一个实现CommandsInterface的抽象类。而占有这个类主体的是成对的register和unregister函数,如:
@Override
public void registerForRingbackTone(Handler h, int what, Object obj) {
Registrant r = new Registrant (h, what, obj);
mRingbackToneRegistrants.add(r);
}
@Override
public void unregisterForRingbackTone(Handler h) {
mRingbackToneRegistrants.remove(h);
}
里面涉及到了Registrant和RegistrantList两个类。
Registrant
中文是注册人的意思。从上面的实例化来看,里面其实是包装了handler,what和Object。句柄函数,消息类型以及消息里面带的数据。同时里面的notify系列函数都会触发将消息发送到句柄函数处理的结果。
RegistrantList
其实就是将一些Registrant放到一个列表里面保存。比如对于铃声播放,有很多Registrant都会对这个事件感兴趣,所以用一个List保存起来,等事件发生的时候,对这个List整个进行处理。
在RIL里面还定义了如下参数:
LocalSocket mSocket;//用于跟底层的rild套接字通信
HandlerThread mSenderThread;//发送数据请求的线程
RILSender mSender;//发送机制
Thread mReceiverThread;//接收数据的线程
RILReceiver mReceiver;//接受机制
在RIL的构造函数中就启动了这两个线程了。
RILSender
class RILSender extends Handler implements Runnable
这个类继承自Handler并且实现了Runnable接口。实际上将RILRequest序列化并且写入底层的rild套接字中,这样就将框架层的消息传入底层了。
注意这个类的实例mSender是用new RILSender(mSenderThread.getLooper())来进行初始化的,所以这个handler的处理过程实际上是在另外一个mSenderThread线程进行的。
RILReceiver
这个类继承自Runnable,它会初始化一个LocalSocket并且connect到rild套接字上,并且从返回的套接字上读取数据,并且用processResponse来处理该parcel数据。返回的数据类型包括RESPONSE_UNSOLICITED和RESPONSE_SOLICITED类型
总结:RIL是框架层和底层通信的一个通信中心和处理中心,里面包含了将上层请求发送到底层和从底层读取信息并在框架层进行处理。底层和上层通过传递的RILRequest对象的mRequest的值判断,这个RILRequest到底是什么类型的请求。
GsmCallTracker
这个类会跟一个Phone(GSMPhone)绑定在一起。它会在Phone的构造函数中被初始化:mCT = new GsmCallTracker(this)。