Android中打电话的数据流程分析

scp侠客

scp侠客

2016-02-19 10:54

下面图老师小编跟大家分享一个简单易学的Android中打电话的数据流程分析教程,get新技能是需要行动的,喜欢的朋友赶紧收藏起来学习下吧!
1.所有流程的起点是从拨号后按下拨号键开始,此步的代码在/android sourcecode/packages/Contacts/src/com/android/contacts/目录的TwelveKeyDialer.java文件中,相关代码如下:
代码如下:

dialButtonPressed() {
.........
final String number = mDigits.getText().toString();
startActivity(newDialNumberIntent(number));
mDigits.getText().clear();
finish();
}

代码中newDialNumberIntent()方法定义如下
代码如下:

private Intent newDialNumberIntent(String number) {
final Intent intent = new Intent(Intent.ACTION_CALL_PRIVILEGED, Uri.fromParts("tel", number, null));
.............
}

从newDialNumberIntent的定义可以看出,当拨号键按下以后,TwelveKeyDial会启动一个特定的组件,该组件的ACTION为:ACTION_CALL_PRIVILEGED,经过查找,该ACTION启动的组件是目下:/android sourcecode/packeges/Phone/的一个文件,在该文件下的AndroidMenifest.xml中可以查到:“ACTION_CALL_PRIVILEGED”启动的Activity的名字是:PrivilegedOutgoingCallBroadcast,但是我们到/android sourcecode/packeges/Phone/src/....目下并找不到该文件,因为该文件在AndroidMenifest.xml中标记有点特殊
activity-alias /,这个标签的意思是这个Activity是另一个Activity的别名,真实的Activity在标签中用“android:targetActivity = OutgoingCallBroadcast”标出,所以 “ACTION_CALL_PRIVILEGED”启动的 PrivilegedOutgoingCallBroadcast 所对应的真实“身份”是 “OutgoingCallBroadcast”。

2.这个时候电话的数据已经流到OutgoingCallBroadcast.java中了。
在OutgoingCallBroadcast.java的onCreate()方法中有:
代码如下:

PRE class=java name="code"protected void onCreate(Bundle icicle) {
.......
Intent intent = getIntent();
........
String action = intent.getAction();
.......
final boolean emergencyNum = (number != null) && PhoneNumUtils.isEmergencyNumber(number);//判断号码是否是紧急号码
.......
if (Intent.ACTION_CALL_PRIVILEGED.equals(action)) {
action = emergencyNum ? Intent.ACTION_CALL_EMERGENCY : Intent.ACTION_CALL;
intent.setAction(action);
}
.......
intent.setClass(this, InCallScreen.class);
startActivity(intent);
}/PREP/P
PRE/PRE
在这个方法中,判断如果所收到的ACTION是“ACTION_CALL_PRIVILEGED”,那么根据所输入的号码是否是紧急号码进行转换,如果是紧急号码,则ACTION = Intent.ACTION_CALL_EMERGENCY,否则ACTION = Intent.ACTION_CALL,并启动转换Activity :InCallScreen.java
P/P
P3. InCallScreen.java依然在目录/packeges/Phone/src/com/android/phone下。/P
PInCallScreen的onCreate中调用initInCallScreen初始化打电话界面,并调用registerForPhoneStates注册电话状态监听.BR
/P
P在onNewIntent()方法中有:/P
PPRE class=java name="code"protected void onNewIntent(Intent intent) {
..........
String action = intent.getAction();
..........
else if (action.equals(Intent.ACTION_CALL) || action.equals(Intent.ACTION_CALL_EMERGENCY)) {
..........
InCallInitStatus status = placeCall(intent);
}
}
//placeCall
private InCallInitStatus placeCall(Intent intent) {
..............
int callStatus = PhoneUtils.placeCall(........);
}/PREInCallScreen.java中的placeCall方法调用PhoneUtils.java文件的placeCall方法。BR
P/P
P4. PhoneUtils.java依然在目录/packeges/Phone/src/com/android/phone下。/P
PPRE class=java name="code"public static int placeCall(...) {
Connection connection;
connection = PhoneApp.getInstance().mCM.dial(phone, numberToDial);
}/PRE继续追踪,在PhoneApp.java中发现,mCM是CallManager.java类的一个对象,而CallManager.java是属于frameworks层的,所以,这个时候数据流已经进入frameworks.P/P
P5. 进入/frameworks/base/telephony/java/com/android/internal/telephony目录。/P
P在CallManager.java的dial()方法中,有:/P
PPRE class=java name="code"SPAN style="BACKGROUND-COLOR: rgb(255,255,255); FONT-FAMILY: Arial, Verdana, sans-serif; WHITE-SPACE: normal"/SPANPRE class=java name="code"public Connection dial(Phone phone, String dialNumber) throws CallStateException {
Phone basePhone = getPhoneBase(phone);
Connection result;
SPAN style="COLOR: #3333ff"result = basePhone.dial(dialString);/SPAN
........
}
private static Phone getPhoneBase(Phone phone) {
if (phone instanceof PhoneProxy) {
SPAN style="COLOR: #ff0000"return phone.getForegroundCall().getPhone();/SPAN
}
return phone;
}/PREP/P
PRE/PRE
PRE class=java name="code"SPAN style="BACKGROUND-COLOR: rgb(255,255,255); FONT-FAMILY: Arial, Verdana, sans-serif; WHITE-SPACE: normal"继续追踪会发现:/SPAN/PREPRE class=java name="code"SPAN style="BACKGROUND-COLOR: rgb(255,255,255); FONT-FAMILY: Arial, Verdana, sans-serif; WHITE-SPACE: normal"PhoneBase.java抽象类实现了接口Phone.java,而GSMPhone.java又实现了抽象类PhoneBase,所以:/SPAN/PRE
P/P
P上述代码中:phone.getForegroundCall()实际相当于GSMPhone对象执行了getForegroundCall()方法。/P
P6. 继续追踪GSMPhone.java,该类位于/frameworks/base/telephony/java/com/android/internal/telephony/gsm/下。/P
PPRE class=java name="code"GSMPhone.java:
GsmCallTracker mCT;
public GsmCall getForegroundCall() {
return mCT.foregroundCall;
}/PRE可以看出getForegroundCall()函数继续调用GsmCallTracker.java的foregroundCall属性。P/P
P7.GsmCallTracker.java位于/frameworks/base/telephony/java/com/android/internal/telephony/gsm/下./P
PPRE class=cpp name="code"GsmCallTracker.java:
GSMCall foregroundCall = new GSMCall(this);/PREP/P
P打开GSMCall.java,找到getPhone()方法,发现:/P
PPRE class=java name="code"GSMCallTracker owner;
public Phone getPhone() {
return owner.phone;
}/PREP/P
P而在GSMCallTracker.java中有如下声明:/P
PPRE class=cpp name="code"GSMPhone phone;/PREP/P
PSPAN style="COLOR: #ff0000"到此,我们得出一下结论:第5部分标记红色的代码所返回的就是GSMPhone的对象,/SPANSPAN style="COLOR: #3333ff"进一步可以得出,第5部分蓝色标记的代码即是调用了GSMPhone对象的dial方法。/SPAN/P
P8. 在GSMPhone.java中:/P
PPRE class=java name="code"GSMCallTracker mCT;
public Connection dial(String dialString) throws CallStateException {
return dial(dialString, null);
}
public Connection dial(String dialString, UUSInfo uusInfo) throws CallStateException {
.......
mCT.dial(.......);
}/PREP/P
P继续调用GSMCallTracker.java中的dial()方法:/P
PPRE class=cpp name="code"GSMCallTracker.java:
GSMCallTracker(GSMPhone phone) {
cm = phone.mCM;
}
Connection dial(String dialString, int clirMode, UUSInfo uusInfo) {
SPAN style="COLOR: #ff0000"cm.dial(........);/SPAN
}/PRE追踪mCM,发现 :P/P
Ppublic CommandsInterface mCM;/P
P所以GSMCallTracker持有CommandsInterface对象,即RIL.Java类的对象,所以"cm.dial(....)"即是调用RIL类对象的dial()方法。/P
P9. RIL.java/P
PBOSS出现。/P
PRIL对象负责把客户端的通话请求按照一定的格式发送给"rild"socket,至此,请求过程完毕。/P
/PRE
展开更多 50%)
分享

猜你喜欢

Android中打电话的数据流程分析

编程语言 网络编程
Android中打电话的数据流程分析

飞语免费电话怎么关闭数据流量打电话

手机软件 应用软件
飞语免费电话怎么关闭数据流量打电话

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

android开发基础教程—打电话发短信

编程语言 网络编程
android开发基础教程—打电话发短信

11种减少Android设备数据流量的方法

Android
11种减少Android设备数据流量的方法

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

梦见打电话

周公解梦 解梦
梦见打电话

怎样和女生打电话 和女生打电话的技巧

情感 恋爱技巧 恋爱宝典
怎样和女生打电话 和女生打电话的技巧

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

婚姻是爱情的坟墓 - QQ伤感分组

婚姻是爱情的坟墓 - QQ伤感分组

笑着哭、最高境界 - QQ情侣分组

笑着哭、最高境界 - QQ情侣分组
下拉加载更多内容 ↓