在android的代码里,电话phone的代码可以分成应用层apps文件中夹的com.android.phone包下,Framework层的com.android.internal.telephony包下,还有RILD和AT命令三部分。所有和phone相关的代码都运行在com.android.phone这个进程中。作为phone的功能如下:
1. 接打电话,收发短信(SmsDispather.java这类代码是跑在phone进程里的),上网链路的建立与维护
2. Sim卡信息与联系人的导入导出。
3. 呼叫等待、呼叫限制和呼叫转移那些运营商补充业务
4. 来电时音频通道的切换,打电话时普通耳机与蓝牙耳机音频通道的切换(这一部分具体过程可能放到多媒体和蓝牙那边完成,但至少phone这边是要调方法)
分别看下各部分代表性的代码吧
App:
PhoneApps.java:onCreate()方法中各种全局变量的初始化,包括phone对象 NotificationMgr对象,PowerManager对象,SimCard对象等
InCallScreen.java:电话应用的主界面,拨号之后的界面就是它了。
CallNotifier.java :用于时间通知和播放铃音等相关查询等操作,
CallCard.java:页面元素的主要部件文体,是InCallScreen.java的子元素
InCallTouchUi.java:电话应用的那些可操作页面元素,是InCallScreen.java的子元素。
PhoneUtils.java:Phone对象生成,最主要的调用phone.dial(),电话是在这拨出去的。
OutgoingCallBroadcaster.java和OutgoingCallReceiver.java不管是拨号盘还是外部调用的Intent都会到这里来,会在这里处理下权限设置。
Framework:
GsmCallTracker.java:继承至CallTracker.java.,它电话FrameWork层的核心,同时也向上暴露了所有上层可用的操作电话的接口。比如dial()和hangup()。
GsmConnection.java:继承至Connection.java,这是对应每一路电话连接的一个抽象对象类,怎么理解呢,AT命令CLCC查询结果对应于Connection类中的成员变量, 一 路电话对应一个对象,具体例子后面文章再给出。
GsmCall.java:继承至Call.java,对于Android phone应用,会将电话分为三个状态:
ForegroudCall(前台Call,其中对应的Connection是Active状态的,即激活状态),
BackgroudCall(后台Call,其中对应的Connection都是Waitting状态的,即保持状态),
RingCall(来电Call,其中对应的Connection是Ring或Waitting状态的,即来电状态
对每一中Call,其内部可以有好几个Connection,因为像BackgroudCall中可以有多Connection,即我们可以同时保持好几路电话。
以上都是以gsm文件下代码为例的,同样的在cdma的文件夹下也有对应的代码。
还剩下RILD,当然少不了RIL.java:只要是和通信有关,肯定少不了它们。关于RIL单独写一篇都不一定写完,还是给出两个链接,参看高手的文章的吧。
http://blog.csdn.net/maxleng/article/details/5576637 RILD
http://blog.csdn.net/maxleng/article/details/5593759 RIL-JAVA
这一部分要说明的是大部分手机AP与通信模块都是用AT命令进行交互的,但AT命令并不是唯一的选择,只是一个桥梁,把它理解成API也可以,所以采用其它的方式实现同样的功能也是可行的,具体采用什么方式要看厂商了,一般是在vendor文件夹下的代码,当然这一部分也很多时候是不开放代码的。
概述就写这么多吧,全是文字没有图,枯燥了点。对于本文提到的phone的功能,在这个系列里,我们集中精力只关注电话相关部分(主要是来电和去电),对于其它与phone有关的功能,有些(像短信彩信和上网)在前面的文章已经给出,如果有兴趣,可以去我的文章列表那里查找。