关于这篇文章的名字实在不知道应该怎么写了,标题先用这个代理下。需求本身是这样的:应用层需要一个参数
,
这个参数是已经通过某些命令与通信模块交互后得到,但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源码优秀的地方,所有对类的设计都尽量符合实际的思维习惯,尽量用代码还原一个真实的世界,一个庞大的优秀代码学习资源。就写到这里了,这篇并没有讲述太多的代码,相比原来的文章更偏向对代码结构的描述,也许最重要还是上面的图。