返回顶部
首页 > 资讯 > 移动开发 >Android中打电话的数据流程分析
  • 180
分享到

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

电话数据Android 2022-06-06 11:06:13 180人浏览 八月长安
摘要

1.所有流程的起点是从拨号后按下拨号键开始,此步的代码在/Android sourcecode/packages/Contacts/src/com/android/contac

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);
}</PRE><P></P>
<PRE></PRE>
在这个方法中,判断如果所收到的ACTION是“ACTION_CALL_PRIVILEGED”,那么根据所输入的号码是否是紧急号码进行转换,如果是紧急号码,则ACTION = Intent.ACTION_CALL_EMERGENCY,否则ACTION = Intent.ACTION_CALL,并启动转换Activity :InCallScreen.java
<P></P>
<P>3. InCallScreen.java依然在目录/packeges/Phone/src/com/android/phone下。</P>
<P>InCallScreen的onCreate中调用initInCallScreen初始化打电话界面,并调用reGISterForPhoneStates注册电话状态监听.<BR>
</P>
<P>在onNewIntent()方法中有:</P>
<P><PRE 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(........);
}</PRE>InCallScreen.java中的placeCall方法调用PhoneUtils.java文件的placeCall方法。<BR>
<P></P>
<P>4. PhoneUtils.java依然在目录/packeges/Phone/src/com/android/phone下。</P>
<P><PRE 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>
<P>5. 进入/frameworks/base/telephony/java/com/android/internal/telephony目录。</P>
<P>在CallManager.java的dial()方法中,有:</P>
<P><PRE class=java name="code"><SPAN style="BACKGROUND-COLOR: rgb(255,255,255); FONT-FAMILY: Arial, Verdana, sans-serif; WHITE-SPACE: nORMal"></SPAN><PRE 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;
}</PRE><P></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></PRE><PRE 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>
<P>6. 继续追踪GSMPhone.java,该类位于/frameworks/base/telephony/java/com/android/internal/telephony/gsm/下。</P>
<P><PRE class=java name="code">GSMPhone.java:
GsmCallTracker mCT;
public GsmCall getForegroundCall() {
return mCT.foregroundCall;
}</PRE>可以看出getForegroundCall()函数继续调用GsmCallTracker.java的foregroundCall属性。<P></P>
<P>7.GsmCallTracker.java位于/frameworks/base/telephony/java/com/android/internal/telephony/gsm/下.</P>
<P><PRE class=cpp name="code">GsmCallTracker.java:
GSMCall foregroundCall = new GSMCall(this);</PRE><P></P>
<P>打开GSMCall.java,找到getPhone()方法,发现:</P>
<P><PRE class=java name="code">GSMCallTracker owner;
public Phone getPhone() {
return owner.phone;
}</PRE><P></P>
<P>而在GSMCallTracker.java中有如下声明:</P>
<P><PRE class=cpp name="code">GSMPhone phone;</PRE><P></P>
<P><SPAN style="COLOR: #ff0000">到此,我们得出一下结论:第5部分标记红色的代码所返回的就是GSMPhone的对象,</SPAN><SPAN style="COLOR: #3333ff">进一步可以得出,第5部分蓝色标记的代码即是调用了GSMPhone对象的dial方法。</SPAN></P>
<P>8. 在GSMPhone.java中:</P>
<P><PRE 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(.......);
}</PRE><P></P>
<P>继续调用GSMCallTracker.java中的dial()方法:</P>
<P><PRE 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>
<P>public CommandsInterface mCM;</P>
<P>所以GSMCallTracker持有CommandsInterface对象,即RIL.Java类的对象,所以"cm .dial(....)"即是调用RIL类对象的dial()方法。</P>
<P>9. RIL.java</P>
<P>BOSS出现。</P>
<P>RIL对象负责把客户端的通话请求按照一定的格式发送给"rild"Socket,至此,请求过程完毕。</P>
</PRE>
您可能感兴趣的文章:Android APP启动方式、启动流程及启动优化分析分析Android中应用的启动流程Android教程之开机流程全面解析从源码分析Android的Glide库的图片加载流程及特点Android系统关机的全流程解析Android Bluetooth蓝牙技术使用流程详解Android Mms之:短信发送流程(图文详解)Android Mms之:接收信息流程(图文详解)Android 2.3 拨号上网流程从源码角度进行分析Android编程输入事件流程详解


--结束END--

本文标题: Android中打电话的数据流程分析

本文链接: https://lsjlt.com/news/28015.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android中打电话的数据流程分析
    1.所有流程的起点是从拨号后按下拨号键开始,此步的代码在/android sourcecode/packages/Contacts/src/com/android/contac...
    99+
    2022-06-06
    电话 数据 Android
  • 分析Android中应用的启动流程
    前言 在我们开始之前,希望您能最好已经满足以下条件:      1、有一份编译后的Android源码(亲自动手实践才会有更深入的理解) ...
    99+
    2022-06-06
    启动 Android
  • mongodb 数据块的迁移流程分析
    目录1. 基本概念1.1 Chunk(数据块)1.2 Chunk Size(数据块大小)1.3 Migration(数据块迁移)1.4 Migration Thresholds(迁移...
    99+
    2024-04-02
  • 使用Webpack打包的流程分析
    目录1、webpacks是什么?2、Webpack安装3、初始化项目4、使用webpack进行JS打包5、使用webpack进行CSS打包总结简单的说了一下webpack是干嘛的,和...
    99+
    2022-12-19
    使用Webpack打包 Webpack打包流程
  • R语言数据建模流程分析
    目录Intro项目背景前期准备数据描述数据清洗预分析及预处理数值型数据类别型数据特征Boruta算法建模模型对比Intro 近期在整理数据分析流程,找到了之前写的一篇代码,分享给大家...
    99+
    2024-04-02
  • Angular中单向数据流的示例分析
    这篇文章主要介绍了Angular中单向数据流的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。变更检测Angular 中,数据是由顶部...
    99+
    2024-04-02
  • Java详细分析连接数据库的流程
    目录注册驱动程序创建连接创建 SQL 语句执行 SQL 语句关闭连接以下 5 个步骤是使用 JDBC 将 Java 应用程序与数据库连接所涉及的基本步骤。 注册驱动程序创建连接创建 ...
    99+
    2024-04-02
  • Unity中的Tilemap流程分析
    作为一个闯关类2d冒险类游戏,地图的设计就尤为重要,我们可以选择手动绘制,也可以导入现有的模板。 主要流程 首先创建文件夹: Tiles存放瓦片 Palette存放调色板 TileM...
    99+
    2024-04-02
  • Hadoop在电力系统中的数据分析
    Hadoop在电力系统中的数据分析主要包括以下几个方面: 大数据存储和管理:电力系统产生的数据量庞大,包括实时监测数据、历史数据...
    99+
    2024-02-29
    Hadoop
  • Android解析JSON数据的方法分析
    本文实例讲述了Android解析JSON数据的方法。分享给大家供大家参考,具体如下: JSON作为一种“轻量”的数据结构传递数据,在JS中有广泛的应用 Google公司对JSO...
    99+
    2022-06-06
    json数据 JSON 方法 Android
  • Vue3中的执行流程思路分析-流程图
    目录一. 前言二. Vue3 思路分析1. createRender(options)2. createApp3. app.mount(‘#app’)4. r...
    99+
    2022-12-03
    Vue3执行流程 Vue3流程图 Vue3执行流程思路
  • openstack(pike) dvr 中南北数据流向分析
    1  在DVR环境中各组件的连接情况如图2 带floatingip,从外部访问虚机,ping floatingip 192.168.100.190此时数据流如图所示2.1 获取MAC外网中的机器首先要通过 ARP 获取虚机浮动 I...
    99+
    2023-06-04
  • C语言数据在内存中的存储流程深入分析
    目录前言类型的基本分类整型浮点数自定义类型整型在内存中的存储原码、反码、补码大端和小端如何判断编译器是大端还是小端浮点数在内存中的存储总结前言 C语言中有char、short、int...
    99+
    2022-11-13
    C语言数据在内存中的存储 C语言数据存储
  • 分析数据库迁云解决方案流程
    本篇内容主要讲解“分析数据库迁云解决方案流程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“分析数据库迁云解决方案流程”吧!Oracle是非常强大的综合数据库,但...
    99+
    2024-04-02
  • 如何分析Web应用的数据流
    这篇文章将为大家详细讲解有关如何分析Web应用的数据流,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。之前做了个玩具叫做 Cum...
    99+
    2024-04-02
  • vue.js组件数据流的示例分析
    这篇文章将为大家详细讲解有关vue.js组件数据流的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、组件组件,可以说是现代前端框架中必不可少的组成部分。使用组件...
    99+
    2024-04-02
  • Hadoop与物流领域的数据分析
    Hadoop是一个开源的分布式计算框架,可以处理大规模数据的存储和分析。在物流领域,Hadoop可以用来处理大量的物流数据,如订单信...
    99+
    2024-02-29
    Hadoop
  • 从源码分析Android的Volley库的工作流程
    Volley现在已经被官方放到AOSP里面,已经逐步成为Android官方推荐的网络框架。 类抽象 对Http协议的抽象 Requeset 顾名思义,对请求的封装,实现了Com...
    99+
    2022-06-06
    工作流 volley 源码 Android
  • PHP 中的 RASP 实现流程分析
    一、什么是 RASP RASP 全称是 Runtime Application self-protection,即运行时应用自我保护,这是一种嵌入到应用程序内部,实时检测来自外部的请...
    99+
    2024-04-02
  • SpringBoot中WEB的启动流程分析
    目录一、DispatcherServlet的注册1.1 把DispatcherServlet注入IOC容器1.2 把DispatcherServlet注入Servlet容器想必大家都...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作