Chinaunix首页 | 论坛 | 博客
  • 博客访问: 360458
  • 博文数量: 107
  • 博客积分: 927
  • 博客等级: 大尉
  • 技术积分: 865
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-13 17:50
文章分类

全部博文(107)

文章存档

2014年(2)

2013年(13)

2012年(16)

2011年(76)

分类: Java

2011-11-11 13:13:00

今天看了看framework里面的telephony相关的代码。。。做个小笔记吧.

路径位于

td p { margin-bottom: 0cm; }p { margin-bottom: 0.21cm; }

frameworks/base/telephony/

首先是Ril相关的。上层的所有对电话的操作和状态 获取等都是通过Ril来实现的,Ril通过发送命令与底层rild进行交互。

 

td p { margin-bottom: 0cm; }p { margin-bottom: 0.21cm; }

CommandsInterface是一个接口,他 定义了操作相关的命令、方法和监听等。。。


BaseCommands则直接继承了CommandsInterface接口。。

Ril继承自BaseCommands,并且负责通过socket与rild通信。。。它将对电话的操作(如:hangupConnection())转换成为了对应的

td p { margin-bottom: 0cm; }p { margin-bottom: 0.21cm; }

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

阅读(350) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~