第1章 主动拨号流程分析
Java Application应用层《--------》Dialer拨号盘和Phone应用;
Java Frameworks 框架层《--------》Telephony Frameworks层
User Libraries系统运行库层《--------》RIL层
拨打电话的大致流程是:Dialer→TeleComService→TeleComFramework→TeleponyService→TelephonyFramework→RIL
总结:
DialpadFragment.onClick()
DialpadFragment.handleDialButtonPressed()
CallIntentProcessor.processIntent()
CallsManager. startOutgoingCall()
CallsManager.java的placeOutgoingCall()
ConnectionService. createConnection()
TelephonyConnectionService.onCreateOutgoingConnection()
GsmCdmaPhone.dial()--》dialInternal()
RIL.dial()
拨号流程总体时序图分析:
拨号流程时序图1
拨号流程时序图图2
1.1 拨号界面DialtactsActivity的onClick
ActivityManager启动DialtactsActivity的Actiivity拨号盘界面,DialtactsActivity中的onClick方法便是进入拨号盘的代码入口。
在onClick方法中会调用mDialpadFragment.dialButtonPressed()和mDialpadFragment.showDialpadFragment。
1.2 DialpadFragment拨号盘表单
目录是:/packages/apps/Dialer/java/com/android/dialer/dialpadview/DialpadFragment.java
如果我们按了拨打电话的按钮就会调用dialButtonPressed();---》handleDialButtonPressed();
1)handleDialButtonPressed():的作用是判断是不是空号,是不是禁播号码;创建intent,并调用DialerUtils. startActivityWithErrorToast()方法。
判断是不是空号,是不是禁播号码
else{正常拨号中创建intent
//调用DialerUtils. startActivityWithErrorToast
图1创建intent,调用DialerUtils的方法
2)CallUtil中
CallUtil.getCallIntent(String number, PhoneAccountHandle accountHandle)--》getCallIntent(number, null, accountHandle)---》getCallIntent(getCallUri(number), callOrigin, accountHandle);--》……--》最终会调用getCallIntent( Uri uri, String callOrigin, PhoneAccountHandle accountHandle, int videoState)
我们看一下getCallUri(),它是将号码封装成uri;且会判断是普通电话流程还是网络电话流程。
图2它是将号码封装成uri
接着看一下最后调用的getCallIntent(),这里intent就创建完了,intent创建完了就会传入CallUtils里面的startActivityWithErrorToast()方法【N4手机】。
图3最终的getCallIntent(),在过程中会将号码封装成uri
3)DialerUtils. startActivityWithErrorToast()
图4会用到CallUtil的startActivityWithErrorToast()
CallUtil的startActivityWithErrorToast()
图5会调用TelecomManager.placeCall()
【getTelecomManager是TelecomManager类型的】
getTelecomMan