Telephony理解

今天看了看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()方法监听到电话时间而进行相应的处理。

 


转载于:https://www.cnblogs.com/chenxian/archive/2011/03/03/1970063.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值