一、DialpadFragment.onResume 方法
1、mVolteConfCallEnable
Volte 通话标识,是返回true,否返回false
2、DialtactsActivity
启动拨号界面
3、queryLastOutgoingCall
二、DialpadFragment.onClick 方法
1、onclick() 响应拨号按钮事件,交由handleDialButtonPressed()处理
2、startActivityWithErrorToast()发起通话界面,获取TelecomManager服务
3、TelecomManager.placeCall 发起通话,即调用到TelecomServiceImpl.placeCall 方法
三、TelecomManager 类
1、路径:frameworks\base\telecomm
2、初始化该对象通过Context.getSystemService(Context.TELECOM_SERVICE)完成;
3、调用TelecomManager.placeCall 方法
4、getTelecomService() 实现 AIDL 服务对象的获取
5、placeCall 继而调用到 TelecomServiceImpl.placeCall()
四、TelecomServiceImpl 类
1、路径:packages/services/Telecomm
2、实例化 ITelecomService.Stub 对象,实现其接口方法 placeCall
3、
注:TelecomManager与 TelecomServiceImpl 通过 TelecomLoaderService实现绑定
实现方法可以参考《AIDL 跨应用服务》
五、TelecomServiceImpl.placeCall 方法
1、获取电话权限,通过userCallIntentProcesser.processIntent 函数传入事件“android.intent.action.CALL”
2、类userCallIntentProcesser 处理三类通话事件类型:CALL , CALL_PRIVILEGED , CALL_EMERGENCY
3、processOutgoingCallIntent() 视频通话判断,继而sendBroadcastToReceiver() --> mContext.sendBroadcastAsUser() 发起通话
4、抽象类Context 的实现类 ContextImpl,实现其方法 sendBroadcastAsUser()
5、ActivityManagerNative.getDefault() 获取 IActivityManager 接口的服务对象,调用ActivityManagerService.broadcastIntent() 方法
6、ActivityManagerService 内部调用 broadcastIntentLocked() 方法