在TelephonyFramework中 Connection有一共有两个
- android.telecom.Connection framewrok/base/telecomm
- com.android.internal.telephony.Connection framewrok/opt/telephony
这里需要关注几个重点
- 两个Connection抽象
两个Connection抽象类对应的代码分别在framework/base/telecom和framework/opt/telephony代码库中。区分包名- android.telecom.Connection
android.telecom.Connection的子类代码在TeleService代码库中,有TelephonyConnection抽象类GsmConnection和CdmaConnection作为TelephonyConnection的抽象的子类- com.android.internal.telephony.Connection
com.android.internal.telephony.Connection的子类代码在framewrok/opt/telephony代码库中,仅有一个子类就是GsmCdmaConnection- 运行空间
GsmConnection,CdmaConnection和GsmCdmaConnection对象全部是运行在com.android.phone进程中- 两个Connection的关系
TelephonyConnection对象的mOrginalConnection属性是GsmCdmaConnection对象的应用,在创建此对象时便建立起来了依赖关系;GsmCdmaConnection对象的mListenrs列表中,保存着TelephonyConnection内部匿名类对象,mOriginalConnectionListener,他重写了com.android.internal.telephony.Connection.ListenerBase类的方法- 消息流转
TelephonConnection通过mOrginalConnection属性访问Telephon Voice Call 语音通话模型中的属性和方法重点:
GsmCdmaConnection通过mListers列表,调用其Listener接口,从而访问TelephonyConnecton主类的方法,传递通话变化的相关信息。我这里就不做代码处理了
这里来讲解一下两个通道处理
TelephonyConnection对象接收通话变化消息有两个通道:
- GsmCdmaPhone对象的RegistrantList消息回调 (setOriginalConnection 方法调用时注册Handle消息)
- GsmCdmaConnection对象的mListeners接口调用 (setOriginalConnection 方法调用时添加进入GsmCdmaConnection中mOriginalConnection.addListener(mOriginalConnectionListener);)
两个通道接收到的通话变化消息,最后都是通过TelephonyConnection的mListener消息调用进行传递的。TelephonyConnection mListeners保存着android.telecom.Connection.Listener对象,他有8个子类,其中最关键的是ConnectionService和TelephonyConferenceController类的mConnectionListener内部匿名类对象