接下来分析一下打电话的流程。输入电话号码的流程这里忽略。输入电话号码之后会点击拨打图标。之后就会走拨打电话的流程了。这部分是在packages/apps/Dialer/src/com/android/dialer/DialtactsActivity.java中实现的。
下面分析源码分析
public void onClick(View view) {
switch (view.getId()) {
case R.id.floating_action_button:
if (mListsFragment.getCurrentTabIndex()
== ListsFragment.TAB_INDEX_ALL_CONTACTS && !mInRegularSearch) {
DialerUtils.startActivityWithErrorToast(
this,
IntentUtil.getNewContactIntent(),
R.string.add_contact_not_available);
} else if (!mIsDialpadShown) {
mInCallDialpadUp = false;
showDialpadFragment(true);
mFloatingActionButton.setImageResource(R.drawable.fab_ic_call);
mFloatingActionButton.setVisibility(view.VISIBLE);
setConferenceDialButtonImage(false);
setConferenceDialButtonVisibility(true);
} else {
//用户点击拨打键
mDialpadFragment.dialButtonPressed();
}
break;
}
}
上面就是click之后将会调用packages/apps/Dialer/src/com/android/dialer/dialpad/DialpadFragment.java
public void dialButtonPressed() {
getView().performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);//按键反馈
handleDialButtonPressed();
}
private void handleDialButtonPressed() {
final Intent intent = CallUtil.getCallIntent(number);
if (!isDigitsShown && !PhoneNumberUtils.isEmergencyNumber(number)) {
// must be dial conference add extra
intent.putExtra(EXTRA_DIAL_CONFERENCE_URI, true);
}
intent.putExtra(ADD_PARTICIPANT_KEY, mAddParticipant && isPhoneInUse());
DialerUtils.startActivityWithErrorToast(getActivity(), intent);
hideAndClearDialpad(false);
}
之后就开始启动拨号的Activity
启动Activity代码如下:
packages/apps/Dialer/src/com/android/dialer/util/DialerUtils.java
public static void startActivityWithErrorToast(Context context, Intent intent, int msgId) {
try {
if ((IntentUtil.CALL_ACTION.equals(intent.getAction())
&& context instanceof Activity)) {
final TelecomManager tm =
(TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
tm.placeCall(intent.getData(), intent.getExtras());
} else {
context.startActivity(intent);
}
} catch (ActivityNotFoundException e) {
Toast.makeText(context, msgId, Toast.LENGTH_SHORT).show();
}
}
这里面有两种拨号的方式:1.直接调用TelecomManager进行呼叫;2,启动一个Activity显示拨号界面。
这里面有一个转换过程:public static final String CALL_ACTION = Intent.ACTION_CALL;
之后拨打电话的流程如下图:
SubscriptionManager本身就是一个service
registerService(Context.TELEPHONY_SUBSCRIPTION_SERVICE, SubscriptionManager.class,)
之后就开始监听消息。
当有新的call之后处理
这里面需要注意,bind的Service为:TelephonyConnectionService
之后就是调用UI注册进来的listener用来更新UI了。