android电话应用程序概述

<style type="text/css"> <!-- p {margin-bottom:0.08in} --> </style>


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()为电话开始接听


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值