android -- phone (一)--概述

来源:互联网 发布:稀客 杨千嬅 知乎 编辑:程序博客网 时间:2024/06/06 01:33
看到标题里的-电话(phone)你会想到什么,估计第一反应是打电话和接电话吧,分别对应着去电和来电,这种想法很正常,手机最基本的功能就是用来接打电话的,只是现在的手机更多的担负了休闲娱乐的任务。突然想起来刚入职时的一个故事,通信组的老大在开会时宣布:以后我们的电话模块对外要叫phone模块,免得其他组同事认为电话的工作只是负责接打电话,phone非常重要….. 误会呀!老大说得没错。好吧,后面我们用phone来指代整个电话系统。

        在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有关的功能,有些(像短信彩信和上网)在前面的文章已经给出,如果有兴趣,可以去我的文章列表那里查找。

0 0
原创粉丝点击