android4.2 telephone应用层分析
InCallScreen.java
复制通话界面的显示和提供人机交互的接口。进入该界面第一个调用ONCreate。否则进入OnNewIntent,该配置文件是incall_screen.xml,当中incallPanel为通话联系人的信息和状态显示,配置文件为call_card.xml,包括两路通话的view定义;InCallTouchUi显示通过管理的控制UI。相应配置文件为incall_touch_ui.xml;
mhandle的handleMessage方法接收到framework的CallManager发出的不同Phone状态的变化。更新UI。消息类型例如以下:
SUPP_SERVICE_FAILED:弹出mSuppServiceFailureDialog
PHONE_STATE_CHANGED:调用requestUpdateScreen方法请求更新通话界面,发送 REQUEST_UPDATE_SCREEN消息
REQUEST_UPDATE_SCREEN:内部调用UpdateScreen
PHONE_DISCONNECT:通话连接失败时调用。在delayedCleanupAfterDisconnect中退出通话界面
handleOnscreenButtonClick响应通话控制的点击button,涉及通话能力控制的相关处理逻辑
PhoneUtils类中的静态方法。如接听电话、挂断电话、恢复、保持通话等通话控制的操作。
联系人信息:CallCard
通话联系人信息的显示和更新实在InCallScreen的updateScreen中完毕的,调用Callcard的updateState方法,displayMaincallStatus显示更新第一路通话的信息。displayOnHoldCallStatus显示hold通话保持的第二路通话信息。通过PhoneUtils.getCallerInfo获取CallerInfo对象。保存了通话联系人的基本信息。
IncallTouchUI 通话控制:
incomingCallWidget:接通/挂断/短信回复时须要使用;
manageConferenceButton:多方通话的界面跳转控制button,仅仅有在多方通话时才显示。
dialpadButton:也就是显示或隐藏拨号盘(DTMF);
audioButton:开启/关闭扬声器;
muteButton:开启/关闭麦克风静音。开启之后对方无法听到你的声音。
holdButton:开启/关闭呼叫保持。
addButton:添加多路通话。也就是在通话的过程中能够暂停当前通话,拨打还有一路通话并接通;
通话控制相关的控件在IncallTouchUI 的updateState中更新,实现OnTriggerListener接口,该接口为锁屏控制的接口,这里4.2做了个改动。在OnTrigger函数中。区分向上、向左和向右三个方向直接定义0,1,2,而不使用SlidingTab的类。在InCallScreen的OnResume和OnPause中注冊ACTION_HEADSET_PLUG接收耳机免提事件的广播,发送EVENT_HEADSET_PLUG_STATE_CHANGED消息,调用showAudioModePopup显示出菜单,进入InCallTouchUI的onMenuItemClick切换音频输出的策略。
DTMFTwelveKeyDialer
布局文件为dtmf_twelve_key_dialer_view.xml,由输入框dtmfDialerField和12按键dialpad.xml组成。
PhoneGlobals:
4.2中将4.0中的PhoneApp中的内容移到了PhoneGlobals中。
OnCreate中创建mWakeLock和mPartialWakeLock进行Phone应用的电源管理。
获取了mWakeLock后。设置中的休眠时间不起作用,屏幕一直高亮,直到锁释放或者手动按power键。获取了mPartialWakeLock后,此时能够关闭屏幕和键盘灯。但不是立马关闭。直到设置的休眠时间到了。关屏。
Sensor感应器获取手机当前的方位,推断手机是否靠近脸部。
mProximityWakeLock电源唤醒锁,获取之后,关闭屏幕。
MediaButtonBoardcastReceive接收耳机HOOK的广播事件。调用PhoneUtils的 handleHeadsetHook响应耳机的HOOK事件。
PhoneAppBoardcastReceive处理Phone应用中杂项的广播事件,像飞行模式、数 据连接、SIM卡状态等变化。
CallNotify:
onNewRingingConnect接收到来电后的处理,调用startIncommingCallQuery查询 联系人信息。通过PhoneUtils的startGetCallerInfo获取GSMConnection的 userData查询 到CallerInfo中。
onPhoneStatechanged通话状态变化的处理。onDisconnect通话连接断开的处理。连接断开有三种类型callLogType:
INCOMMING_TYPE(来电)OUTGOING_TYPE(呼叫)MISSED_TYPE(未接来电)