(一)android打电话流程:
1、打电话的入口是在OutgoingCallBroadcaster这个类中,下层我就没深入去理解了,此类是继承的Activity,在其oncreate方法里面用intent去接收需要拨打的电话,然后判断此号码是否为紧急号码
(1)如果为紧急号码:立即启动InCallScreen类,并发送广播
(2)如果不是为紧急号码:只发送“Intent.ACTION_NEW_OUTGOING_CALL”广播,并不立即启动InCallScreen类
2、OutgoingCallReceiver,此类是OutgoingCallBroadcaster里的一个内部类,顾名思义,主要用于接收OutgoingCallBroadcaster发送的广播
判断是否已经启动InCallScreen,若没有启动则进行一些初始化操作,比如判断若phonetype为CDMA,则初始化OTA。并从intent中取出电话号码并启动incallscreen类(号码已由intent带给了incallscreen类)
名词解释:CDMA(一种通讯技术,可以减少手机之间的干扰,通话品质也比GSM好)
OTA(一种空中下载技术,是通过GSM或CDMA的空中接口对SIM卡数据及应用进行远程管理的技术)
3、InCallScreen
此类为通话核心类,这个类中东西很复杂,负责整个通话界面(包括单方和多方通话),并且在首次oncreate后,就算通话结束也只会调用其onstop方法,此类一直不会被finish()掉。当onstop后若重新打电话则会调用onnewintent()方法,不会再经过oncreate
IncallScreen布局及各个功能
(1)包含CallCard类:CallCard负责通话主要界面(callcard里面又包含call_card_person_info,这个就不细说了),如显示保持恢复按钮,电话头像,通话时间,通话号码或人名以及通话人头像
(2)包含dtmf_twelve_key_dialer配置文件:主要负责通话中拨号键盘的布局
(3)包含InCallTouchUi这个重要的类:主要负责来电时的锁屏界面(往左滑是拒绝来电,往右滑是接听来电),该类继承SlidingTab来实现滑屏效果,后面会说到运用SlidingTab能实现自己的来电锁屏界面
![【转】android电话流程(打电话,接电话,挂断电话)(一) 【转】android电话流程(打电话,接电话,挂断电话)(一)](https://i-blog.csdnimg.cn/blog_migrate/db4f3195028edf15babe46d39e78e11a.jpeg)
(4)包含incallmenu类,主要负责MENU菜单的一些操作(如挂断电话,免提,合并通话等),虽然incallmenu负责MENU的绘画及布局,但是实际onclick后的操作是由incallscreen类来操控的)
打电话时InCallScreen的具体流程
前面说到OutgoingCallReceiver解析号码并启动incallscreen类,第一次启动时首先进入了其oncreate方法
(1)初始化PhoneApp类
(2)增加FLAG参数:FLAG_DISMISS_KEYGUARD(这个参数的作用主要在于解除锁屏,比如锁屏时来电,这时候就需要先解除锁屏再显示画面,这样用户就能在锁屏时接收到来电了~)
(3)setPhone
(4)调用初始化各种组件(callcard,menuview等)
初始化组件等一系列操作后,进入onresume方法:
(1)调用PhoneApp的disablestatusbar,用来更新状态栏(添加拨打电话的图标)
(2)判断是否需要蓝牙连接
(3)判断如果是CDMA通话,则初始化ota状态,并设置通话模型
(4)mPhone.clearDisconnected(); 断开所有网络连接
3、PhoneUtils:
顾名思义为工具类,主要用于phone的生成,另外之前所说menu菜单的onclick后的操作是由incallscreen类来操控,实际上呢是 phoneutils在做具体的工作(如挂断电话,开启扬声器等),incallscreen只是去调用phoneutils里面的方法而已。
4、PhoneApp:
一个普通的类,当拨打电话及接听电话时,负责跳转至incallscreen中,利用这个类我们可以自己去创建非锁屏状态下的来电(原生中不管锁屏还是非锁屏都是一样的来电界面),另外此类还提供display和dismiss方法,以达到显示及关闭incallscreen的目的
5、CallNotifier:
监听phone状态的改变,假如监听到为挂断电话时,调用phoneapp中的dismiss方法使incallscreen关闭掉