android电话流程(打电话,接电话,挂断电话)(一)

时间:2022-11-09 13:32:29

(一)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电话流程(打电话,接电话,挂断电话)(一)


(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关闭掉

 

大致说了下基本类的各司其职,如果我们要在源码基础上添加或修改我们自己的功能的话该怎么实施呢?