ndroid 5.0 Phone 模块代码结构较上个版本发生了很大变化,这样做的好处是代码易于管理和阅读,脱藕,InCallUI可实现客制化。

本篇主要介绍的内容有以下部分:

1:Android 5.0 Phone 模块代码结构基于上一个版本的改变;

2:Android 5.0 Phone 模块拨号流程与来电流程

3:Android 5.0 Phone 模块主要功能类介绍。

Android 5.0 Phone 模块代码结构基于上一个版本的改变

Android 4.4中Telephony和InCallUI直接通过adil方式进行交互

Android 5.0 中增加了两部分代码 frameworks/base/telecomm和packages/servi
ces/Telecomm,前者负责Phone模块中InCallUI,Telecomm,Telephony三者的交互处理,后者负责Phone模块主要业务的处理,如拨号的预处理,来电的处理,以及与蓝牙设备,有线耳机交互

Android 5.0 Phone 模块拨号流程与来电流程

图形分析:

1:在DialpadFragment.java中使用Intent启动activity:包含信息有Intent.ACTIO

N_CALL,Uri(处理过的号码格式),TelecomManager.EXTRA_START_CALL_WITH_VIDEO_

STATE(通话模式:视频or音频),PhoneConstants.EXTRA_CALL_ORIGIN(表示拨出号码的

activity,DialtactsActivity之外的都为null),TelecomManager.EXTRA_PHONE_

ACCOUNT_HANDLE(注册的账户)。

2:packages/services/Telecomm:CallActivity.java被启动,在其成员方法中

processOutgoingCallIntent(),sendBroadcastToReceiver()主要判断了ip拨号是否符合规则,是否具有拨号的权限。符合要求的会继续发出广播

3:CallReceiver是个BroadcastReceiver,收到广播后使用Intent中包含的数据信息(号码,账户)作为参数,调用:

创建了Call对象。该类存储了建立一个call时相关的数据,如CallState,GatewayInfo,Pho

neAccountHandle等。如果创建的Call对象不为null,则进一步在NewOutgoingCallIntent

Broadcaster中处理。

4:NewOutgoingCallIntentBroadcaster的processIntent()中主要对号码进行了判断处理,语音信箱,紧急号码。在其方法broadcastIntent()中发出

Intent.ACTION_NEW_OUTGOING_CALL 这样的广播,由NewOutgoingCallBroadcas

tIntentReceiver接着处理。

5-6:CallsManager的placeOutgoingCall()方法中处理是否打开speaker,把call对象添加到mCalls列表中,调用Call中方法startCreateConnection()创建连接。

7-9:在CreateConnectionProcessor的方法attemptNextPhoneAccount()中获取了ConnectionServiceWrapper对象,调用:

service.createConnection(mCall, new Response(service));进一步创建连接,在

createConnection中有:
mServiceInterface.createConnection(call.getConnectionManagerPhoneAccount(),callId,new ConnectionRequest(call.getTargetPhoneAccount(),
call.getHandle(),extras,call.getVideoState()),call.isIncoming());
mServiceInterface 对象类方法在frameworks/base/Telecomm中实现,这里使用aidl方式实现通信

10-11:frameworks/base/Telecomm:ConnectionService内部实现了IConnectionService.Stub(),这里会调用其实现的方法createConnection(),在该方法内部,调用onCreateOutgoingConnection()会进一步调用到packages/services/Telephony中的方法进行向RIL.java中进行拨号,同时返回一个Connection,创建完毕后调用mAdapter.handleCreateConnectionComplete()对Connection进行处理。
12:ConnectionServiceAdapter与ConnectionServiceWrapper的交互通过aidl方式进行,ConnectionServiceWrapper内部实现了 IconnectionServiceAdapter.Stub()
在ConnectionServiceWrapper中运行handleCreateConnectionComplete()方法。
13-16:对创建的Connection进行一系列的处理,主要运用到接口的实现调用,在类Call中handleCreateConnectionSuccess()方法使用Connetion对象的信息对Call相关状态进行设置。同时通知监听者CallsManager
17-18:在CallsManager中调用 addCall(call),进一步调用监听者InCallController的onCallAdded().在onCallAdded()中调用IInCallService.stub对象,这里使用aidl方式,在frameworks/base/telecomm:中InCallService内部实现了IInCallserice.stub

19:在InCallService中会调用Phone对象的internalAddCall()方法,在Phone中会调用内部接口实现者的实现的方法:onCallAdded(this, call);在Packages/apps/InCallUI:
中CallList实现了该接口,这里会启动通话界面。

来电流程:

:packages/services/Telephony:在PstnIncomingCallNotifier.java中注册了对来电的监听:

mPhoneBase.registerForNewRingingConnection(mHandler,EVENT_NEW_RINGING_CONNECTION, null);

来电时,从收到的数据中获取frameworks/opt/.../Connection对象,进一步Connection中获取frameworks/opt/..../Call,判断Call对象不为null,state为ringing时,进一步调用方法sendIncomingCallIntent(),对Connection中数据进行解析封装,使用Bundle

对象extras.putParcelable(TelephonyManager.EXTRA_INCOMING_NUMBER, uri);

调用TelecommManager方法:addNewIncomingCall(),将extras作为参数传入。

2:在TelecommManager中,判断服务当前是否处于连接状态,如果一连接则调用

ItelecomService.Stub的实现对象,即TelecomServiceImpl的方法:

addNewIncomingCall(),传入参数为:PhoneAccountHandle对象,Bundle 对象。

3:在TelecomServiceImpl的方法addNewIncomingCall()中所做处理如下:

4-6:4-6:CallActivity被启动后,通过判断Intent中action,发广播给CallReceiver。

在CallReceiver中对Intent进行简单的处理(判断PhoneAccountHandle是否为null)后调用CallsManager().processIncomingCallIntent(),在该方法中创建Call对象,然后使用Call对象建立连接。

7-8:在Call的startCreateConnection方法中创建CreateConnectionProcessor对象后,调用该对象的process()方法,在process()方法中进一步调用attemptNextPh

oneAccount()方法。在attemptNextPhoneAccount()方法中使用ConnectionSer

viceWrapper的成员方法createConnection()。

9-11:ConnectionServiceWrapper中createConnection()方法实现了接口BindCallback()

在实现的接口方法中调用IConnectionService对象来创建连接。这里使用adil的方式,最终会在ConnectionService创建连接,在createConnection()方法中,根据来电标志执行:onCreateIncomingConnection,创建了一个android.telecom.Connection对象。接着调用ConnectionServiceAdapter的handleCreateConnectionComplete()方法对创建好的Connection对象进行数据处理。这里使用adil方式,实际的处理交给了IConnectionServiceAdapter的实现者,ConnectionServiceWrapper的内部类Adapter。

12-15:经过一系列的接口方法调用后在Call的方法handleCreateConnectionSuccess()获取Connection的成员变量,设置phone当前的相关状态。然后启动一个延时线程,在该线程中调用接口方法onSuccessfulIncomingCall(),CallsManager实现了该接口方法。

16-17:在CallsManager的方法onSuccessfulIncomingCall()中有addCall(),在addCa

ll()中调用接口方法onCallAdded(),InCallController中实现了该接口方法。onCallAdde

d()中继续使用adil方式调用IInCallService的方法addCall()。

18:InCallService内部类实现了接口IInCallService.Stub,在addCall()中直接调用了Phone类的方法internalAddCall(),在该方法中创建了android.telecom.Call对象,调用接口方法onCallAdded(),将android.telecom.Call对象交给接偶实现者处理。CallList内部实现了该接口,处理过程中加载来电界面。

Android 5.0 Phone 模块主要功能类介绍

该图大致概括了Phone模块内部交互的关系,包括InCallUI,services/Telephony,service

s/Telecomm,frameworks/base/telecomm。

1:InCallUI部分:

上图中CallList,TelecomAdapter这两个类在InCallUI中,CallList内部实现了android.telecomm.Phone.Listener接口,负责与 frameworks/base/teleco

mm的交互,即负责通话界面的处理。TelecomAdapter负责通话中一些操作的处理,调用frameworks/base/telecomm中的类方法进行处理,如录音,合并通话,保持通话等。

2:services/Telephony部分:

TelephonyConnectionService,PstnIncomingCallNotifier 这两个类在services/Tel

ephony中,TelephonyConnectionService继承了ConnectionService,在拨号和来电是用来处理与frameworks/opt/telephony交互部分, PstnIncomingCallNotifier注册了对来电的监听,来电时负责和frameworks/base/telecomm交互。

3:services/Telecomm部分:

该部分负责了Phone模块主要业务的处理,CallsManager管理与Call相关的业务处理,其构造方法中创建了铃声,有线耳机,蓝牙等相关的类对象,在处理Phone模块业务时起到了桥梁的作用。

CallActivity,在拨号和来电时会被创建,主要用来对Intent进行简单的处理判断。

TelecomServiceImpl,开机自动加载的一个服务,实现ITelecomService.Stub接口,来电时被TelecomManager调用,与frameworks/base/telecomm交互。

ConnectionServiceWrapper,负责services/Telecomm与frameworks/base/telecomm

交互,实现了IConnectionServiceAdapter.Stub,提供代理给frameworks/base/teleco

mm,同时绑定IConnectionService.Stub实现者ConnectionService,用来和framework

s/base/telecomm交互。

4:frameworks/base/telcomm部分:
ConnectionService继承了Service,内部实现IConnectionService.Stub接口,是fram

eworks/base/telcomm部分的核心类,在来电或拨号时创建android.telecom.Connect

ion对象用来保存通话相关信息,随后将信息写进ParcelableConnection对象中交给Conne

ctionServiceWrapper处理。

InCallService同样继承了Service,其内部实现了IInCallService.Stub,用来处理通话界面相关事务,IncallController调用IInCallService.Stub代理完成对InCallUI的更新。

android.telecom.Phone,内部接口在InCallUI中被实现,在Phone状态发生变化时用于和InCallUI交互。

android.telecom.Call:在InCallUI中使用该对象对某个通话进行操作,如接听,挂断,拒接,合并通话,保持通话等。

Android 5.0 Phone 模块介绍相关推荐

  1. Android 9.0 AutoMotive模块之CarService

    上一篇对Automotive模块的Vhal作了总结,本篇文章主要从上层CarService的实现来构析Automotive所提供的功能. 这里主要从以下几点进行源码解读. CarService功能解析 ...

  2. Android服务模块作用,Android 9.0 AutotoMotive模块之CarService

    Android 9.0 AutotoMotive模块之CarService Android 9.0 AutotoMotive模块之CarService 上一篇对Automotive模块的Vhal作了总 ...

  3. android 7.0 新功能介绍(Nougat)

    多窗口支持 在 Android 7.0 中,我们为该平台引入了一个新的而且非常需要的多任务处理功能 - 多窗口支持. 现在,用户可以一次在屏幕上打开两个应用. 在运行 Android 7.0 的手机和 ...

  4. 面向开发者的 Android 8.0 Oreo 详细介绍

    无需原生开发基础,也能完美呈现京东商城.<混合开发京东商城系统,提前布局大前端>课程融合vue.Android.IOS等目前流行的前端和移动端技术,混合开发经典电商APP--京东.课程将各 ...

  5. 三星android功能怎么用,三星GALAXY S II升级Android 4.0新功能介绍及使用技巧

    本文导航第1页:(一) 第3页:(三) 第2页:(二) 大家的三星GALAXY SII 升级Android 4.0了吗?在升级ICS (Ice Cream Sandwich) 冰淇淋三明治系统之后,有 ...

  6. 安卓代码怎么设置省电模式_Android 5.0开启省电模式的方法 Android 5.0省电介绍

    你也许还没有注意到,Android 5.0 Lollipop版本统正式加入了电池保护模式.这一功能的引进,帮助Android用户彻底告别了需要寻找第三方应用程序来延长续航时间的尴尬日子.当然,在该项功 ...

  7. wedo2.0编程模块介绍_能量黑科技模块系列十:RFID魔块

    RFID魔块 RFID 此模块可以对套件配套的RFID卡或者空白RFID卡进行读写,用于权限验证的DIY制作.常规的公交卡.地铁卡是无法进行写入,但可以读取UID号.配套RFID卡内存为1K,有16个 ...

  8. wedo2.0编程模块介绍_福特福克斯TCM重新编程操作

    适用范围支持车型/年款:新福克斯 2011 – 2018 1.6L/2.0L DPS6变速箱 车型嘉年华 2013 1.5L DPS6变速箱 车型翼博 2013 – 2016 1.5L DPS6变速箱 ...

  9. android 打开免打扰模式,Android 6.0设置模块免打扰功能浅析

    免打扰功能的入口在NotificationSettings中, 点击列表项跳转到ZenModeSettings.java android:title="@string/zen_mode_se ...

最新文章

  1. 用数据分析《你好,李焕英》“斐妈”爆红的真相
  2. 装完Ubuntu后要干的事-安装常用软件
  3. 在MyEclipse中导入做好的java项目出现错误The project cannot be built until build path errors are resolved
  4. 1821: 入学考试(1261采药)01背包
  5. call super class will trigger CGLIB
  6. P2480-[SDOI2010]古代猪文【中国剩余定理,Lucas定理】
  7. HashMap 实现原理
  8. LeetCode 链表的插入排序
  9. android 键盘遮盖输入框_android弹出输入框,软键盘挡住部分编辑框
  10. Android 系统(80)---Android 8.0 7.0 6.0 动态权限管理
  11. 基于JAVA+SpringBoot+Vue+Mybatis+MYSQL的排课管理系统
  12. python 验证码test
  13. 只怪自己当时年纪太小,一心只看那只泼猴了
  14. 基于better-scroll实现的类似ios选择器
  15. 计算机没有无线网卡驱动程序,电脑上没有光驱怎么安装无线网卡驱动 - 驱动管家...
  16. 使用OpenCV测量图像中物体之间的距离
  17. Google Play Academy 组队 PK 赛,正式开赛!
  18. 阿里天池项目:淘宝电商数据分析(mysql)
  19. 程序员不得不知道的英语词汇
  20. 新用户腾讯云国外服务器2核4G服务器使用攻略

热门文章

  1. WordXML格式初步分析
  2. HDU 1753 大明A+B
  3. 莱茵特机器人奖金制度_TUV莱茵携手国机智能合作中国机器人规范制定
  4. 小程序颠覆二次元,随时随地进入漫画世界
  5. 开源云存储minio
  6. 关于Adobe Premiere安装失败,错误代码为1的解决办法
  7. NBT封面:水稻NRT1.1B基因调控根系微生物组参与氮利用(作者解读)
  8. HTML网页背景音乐怎么在谷歌,谷歌浏览器怎么添加背景音乐
  9. 现在的局域网监控软件需要具备那些功能?
  10. vs2010c语言窗口程序,VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)...