android电话应用程序概述
一.总览
1.phone应用主界面
2.拨出电话流程
3.接入电话流程
二.phone应用主界面
phone应用程序的主界面包括”phone”,”Calllog“,“Contacts”,”Favorites”四个部分组成。
Phone:由12键的拨号盘组成。输入号码后单击电话图标按钮进行拨号
Calllog:存放呼入和呼出的历史记录。
Contacts:存放电话联系人。
Favorites:存放常用的电话联系人。
(1)以上4个部分由“DialtactsActivity.java”作为主要入口。在onCreate()方法中通hasPhoneProviderExtras过“setupDalerTab()”,“setupCallLogTab()”,”setupContactsTab”,”setupFavoritestTab()”以上4个方法构建以“tabHost”形式显示4个部分的主界面入口。而以上4个功能界面的实现分别由“TwelveKeyDialer.java”,”RecentListActity.java”,”ContactsListActivity.java”,3个部分实现。在这里,我们重点描述“Phone”部分的实现。
三.拨出电话流程
进入由”TwelveKeyDIaler”构建的电话拨号程序,输入呼出的电话号码,单击拨号按钮。拨号的实现由placeCall()中实现。
Intent intent = newIntent(Intent.ACTION_CALL_PRIVILEGED,
Uri.fromParts("tel",number, null));
if (number ==null || !TextUtils.isGraphic(number)) {
// Thereis no number entered.
if(phoneIsCdma() && phoneIsOffhook()) {
// Weonly want to send this empty flash extra if we're CDMA and the
//phone is offhook (don't want to send if ringing or dialing)
intent.putExtra(EXTRA_SEND_EMPTY_FLASH,true);
sendEmptyFlash= true;
} else {
playTone(ToneGenerator.TONE_PROP_NACK);
return;
}
}
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
通过查找”Intent.ACTION_CALL_PRIVILEGED”的实际字符窜,得知intent跳转的类为OutgoingCallBroadCaster.java.在此类的onCreate()方法中,对呼出的电话号码进行判断,并把号码定义分类为“紧急号码”和“非紧急号码”:如果是紧急号码,则通过intent.setClass(this,InCallScreen.class);startActivity(intent)执行;如果是非紧急号码,则通过newIntent(Intent.ACTION_NEW_OUTGOING_CALL);sendOrderedBroadcast();跳转到内部类OutgoingCallReceiver.java中执行拨号处理。
在“OutgoingCallReceiver”中“doReceiver()”对电话网络进行判断是否为cdma网络,如果是进一步判断是否基于OTA呼叫(这点不是很明白?)。此后跳转至IncallScreen类,进行呼叫处理。
“IncallScreen”类构建了电话呼出界面以及对呼出的处理和响应。如果是第一次呼叫则执行onCreate(),非第一次则执行onNewIntent().此后这两个方法中都拥有internalResolveIntent(intent),此方法获得电话呼叫状态,其中包括了呼出状态和呼入状态。其中的placecall()方法返回得到呼出状态,返回结果由IncallScreen中的“InCallInitStatus”枚举变量定义。注:通过在placecall()中的phone.dial()建立与framework层的电话拨号连接。
四.电话呼入流程
首先,呼叫通知由phoneApp来实现。
PhoneApp.java->onCreate()->CallNotifier.java->handleMessage()->onNewRingingConnection()接受来自ril层的电话响应,并发出电话铃音或者震动。
当电话发出铃音或震动的同时,继续执行PhoneUtils.java->showIncomingCallUi()->PhoneApp.java->voiddisplayCallScreen()中的startActivity()跳转到InCallScreen.java中执行初始化呼入界面。
继续执行internalResolveIntent(intent)->internalAnswerCall()->PhoneUtils.answerCall()->Phone.accept()为电话开始接听