android -- phone (四) 其实我只想加个接口

关于这篇文章的名字实在不知道应该怎么写了,标题先用这个代理下。需求本身是这样的:应用层需要一个参数 ,   这个参数是已经通过某些命令与通信模块交互后得到,但android源码本身并没有相应的方法让应用层直接调用,所以要加个接口(这里接口的含义比较广泛)出来方便上层调用。所涉及的代码主要是 phone 相关的代码中。具体点说就是通过RIL获取数据,再把RIL得到的数据通过我们添加的方法传给应用层或让应用层调用获取数据。就这点事,可实际编译过程却一路红灯   --- 编译失败,为什么呢,总是少加些了代码,好吧,只怪自己太粗心了, The devil is in the details 。谨以此文记念那悲剧的一天。
 
    我们要涉及的类有:
          phone.java  Gsmphone.java   CDMAphone.java TelephoneyManager.java  RIL.java   CommmandInterface.java phoneBase.java 
         ITelephony.aidl   RILConstants.java SipCommnadInterface.java  SimulateCommands.java   SipPhone.java Ril-reference.c 
    应该就这些了,如果想添加和  phone 相关的功能接口,从 packages   framework ,,这些类里面多少都要加点东西,一个都不能少。至于原因还是要从它们之间的继承实现关系看起,先贴一张图,手画了一张试下效果。这张图大概描述了上述类的关系。
 

回到我们要实现的功能,对于非phone进程的应用要想获取phone的实例需要通过 telephonyMamager.java, 进而取关于 phone 的一些状态,比如监听来电,去电消息。phone进程是指 com.android.phone 这个进程, 当然如果你可以让你的程序伪装运行在 phone 进程里,做法是在你的应用中的 AndroidManifesl.xml 里参加上  android:sharedUserId="android.uid.phone"  ,这样做的前提是你的代码要作为一个  apk 独立运行。其实我们思路很简单, 通过T elephonyMamager.java  先来到  phoneIntermamanager.java ,这样就进入 phone 的管辖范围了,也就来到上图所展示的代码范围了,接下来会  phoneproxy.java ,G smphone.java  ,具体代码实现涉及了代理模式,多态,aidl的一些知识,到了Gsmphone.java,下面的路就是RIL的事情,这么看来真的没有什么技术含量,麻烦的地方是android的源码代码封装性非常好,类接口之间的继承实现关系比较多,比如你在接口类phone里加了代码,按上图的继承关系相应的类里都要加对应的代码,有些代码不加在Eclipse里是不会报错,但编译的时候会出错,一不小心漏加了某个类就出错了。其实主线代码并不多,就下面这几个:
  TelephoneManager.java ----> PhoneInterfaceManager.java ----> PhoneProxy.java ---> GsmPhone.java ---> RIL.java。只是根据基类和接口扩展出来的类多了些,不过这也是android源码优秀的地方,所有对类的设计都尽量符合实际的思维习惯,尽量用代码还原一个真实的世界,一个庞大的优秀代码学习资源。就写到这里了,这篇并没有讲述太多的代码,相比原来的文章更偏向对代码结构的描述,也许最重要还是上面的图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值