今天看了看framework里面的telephony相关的代码。。。做个小笔记吧.
路径位于
frameworks/base/telephony/
首先是Ril相关的。上层的所有对电话的操作和状态 获取等都是通过Ril来实现的,Ril通过发送命令与底层rild进行交互。
CommandsInterface是一个接口,他 定义了操作相关的命令、方法和监听等。。。
BaseCommands则直接继承了CommandsInterface接口。。
Ril继承自BaseCommands,并且负责通过socket与rild通信。。。它将对电话的操作(如:hangupConnection())转换成为了对应的
RIL_REQUEST_XXX发送到rild
RILReceiver则实现了Runnable接口。即启动一个循环一直监听socket,看底层是否发送相关的信息。收到respone进行相关处理后执行processResponse()方法
该方法内通过判断type分别执行processUnsolicited (p)和processSolicited (p)方法,这也就能获取电话状态等消息。
这里将会根据不同的response而通知相应的已经注册了监听的对象(通过RegistrantList的notifyRegistrants通知,之前已经通过phonebase的RegisterFor***changed方法注册).
注册的时候将会把Handle和Messae.what等注册进一个RegistrantList实例(加入一个arrayList),Ril收到response之后也是通过RegistrantList来将相应的信息返回给已经注册
的实例对象。
CallTracker就注册了相应的监听。所以当有对应的Response的时候,就会返回给CallTracker,然后CallTracker进行相应的处理,比如updatePhoneStae等。。。
在updatePhoneStae方法里又会调用对应的phone.notifyPhoneStateChanged(根据电话类型分为GSMPhone和CDMAPhone).在此方法内Phone对象又会调用PhoneNotifier.notifyPhoneState
方法。
PhoneNotifier是一个接口定义了电话状态改变,信号改变的通知等方法。具体的实现是在DefaultPhoneNotifier里面.这里就会将具体的电话事件转换为函数调用,通知TelephonyRegistry
TelephonyRegistry就会将电话事件给通知出去,这里分两种类型通知。1是通过广播发送,2是通过之前注册的Listener回调回去。
至此,电话事件就对第三方应用可见了。第三方应用就可以通过接受广播或者TelephonyManager.listen()方法监听到电话时间而进行相应的处理。