Android打电话流程
Android 打电话流程
1 OutgoingCallBroadcaster.java
点击拨号盘拨打按钮后,进入通话的Phone 包。此时首先进入的函数是
OutgoingCallBroadcaster.java,该类是一个Activity。
activity 的生命周期可知,第一次进入时应调用onCreate()函数。(在该类中也只实现了这个函
数。)解析一下这个函数:
1.1) 首先获取Intent 对象,获取拨出的号码。
1.2) 接着判断号码是否为紧急号码,如果是紧急号码,将 callNow 变量赋值为true ,启动
InCallScreen,并发送广播。而在receiver 里面判断 callNow 为ture 就直接finish ,而不再
重复启动InCallScreen ;如果不是紧急号码,将callNow 变量赋值为false ,发送广播
“Intent.ACTION_NEW_OUTGOING_CALL”。
2 OutgoingCallReceiver.java
广播发送后OutgoingCallReceiver 将会收到该息。该类是一个内部类,在类
OutgoingCallBroadcaster 里面,作用是接收OutgoingCallBroadcaster 发送的广播,判
断是否已经启动 InCallScreen。没有启动的话就进行一些初始化,如:对OTA 进行初始化。接收
到广播之后,从Intent 里面取出电话号码及其URi。然后,设置 Intent 为ACTION_CALL ,并
带上号码和uri。启动InCallScreen。关闭该Activity。
OTA:Over-the-Air Technology 空中下载技术,是通过移动通信(GSM 或CDMA)的空中接口
对SIM 卡数据及应用进行远程管理的技术。空中接口可以采用WAP、 GPR 、CDMA1X 及短消
息技术。OTA 技术的应用,使得移动通信不仅可以提供语音和数据服务,而且还能提供新业务下载。
GSM :Global System for Mobile Communications ,中文为全球移动通讯系统,俗称"全
球通"。
CDMA :Code Division Multiple Access,又称码分多址,是在无线通讯上使用的技术,
CDMA 允许所有的使用者同时使用全部频带(1.2288Mhz),并且把其他使用者发出的讯号视为杂讯 ,
完全不必考虑到讯号碰撞 (collision) 的问题。CDMA 的优点包括:CDMA 中所提供的语音编码技
术,其通话品质比目前的GSM 好,而且可以把用户对话时周围环境的噪音降低,使通话更为清晰。
3 InCallScreen.java
该类extends 了Acitivity ,并且implements 了 OnClickListener,OnTouchListener
和OnQueryCompleteListener。该类主要是负责通话的那一个界面,并且还负责菜单项各种按
键事件和触摸时间的处理。同时本类还复写的finish()方法,所以一般不会被finish 掉,调用这个方
法时它又把自己放回栈中。 InCallScreen 可以接收这个Intent 并启动。
3.1) onCreate(第一次)
3.1.1) callScreenOnCreate 获得通话界面被创建的时间。
3.1.2) PhoneApp 唤醒后台的服务程序。
3.1.3) 判断当前的通话状态( IDLE =没有通话行为,RINGING =正在通话或呼叫等待,
OFFHOOK = The phone is off hook. At least one call exists that is dialing,
active or holding and no calls are ringing or waiting. ),如果正在通话,不会出现键盘
锁。接着设置mPhone and mForegroundCall/mBackgroundCall/mRingingCall。
3.1.4) getBluetoothHandsfree 设置蓝牙耳机,如果存在蓝牙耳机,则安装该设备。
3.1.5) initInCallScreen 加载各种view 组建。
3.1.6) 对通话的各种状态进行