android打电话 接电话 挂电话流程分析
android打电话过程:
1.TwelveKeyDialer.java,onKeyDown()->dialButtonPressed()
2.OutgoingCallBroadcaster.java,onCreate()
sendOrderedBroadcast(broadcastIntent, PERMISSION,
new OutgoingCallReceiver(), null, Activity.RESULT_OK, number, null);
3.OutgoingCallBroadcaster.java,OutgoingCallReceiver()
onReceive->context.startActivity(newIntent);
4.InCallScreen.java,onCreate(第一次)/onNewIntent(非第一次)
5.InCallScreen.java,placeCall
6.PhoneUtils.java,placeCall
7.CdmaPhone.java,dial
8.RIL.java,dial
RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result);
...
send(rr);
接听电话的流程:
1.创建CDMAPhone时,mCT = new CdmaCallTracker(this);
2.创建CDMACallTracker时,cm.registerForCallStateChanged(this, EVENT_CALL_STATE_CHANGE, null);-->
BaseCommands.mCallStateRegistrants.add(r);
3.RIL中的RILReceiver线程首先读取从rild中传来的数据:RIL.processResponse->RIL.processSolicited
4.对应于incoming call,RIL.java收到RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED消息,触发mCallStateRegistrants中的所有记录。
5.CdmaCallTracker处理EVENT_CALL_STATE_CHANGE,调用pollCallsWhenSafe
6.函数pollCallsWhenSafe处理:
lastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT);
cm.getCurrentCalls(lastRelevantPoll);
7.RIL.getCurrentCalls
RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_CURRENT_CALLS, result);
...
send(rr);
8.接着RIL调用processSolicited处理RIL_REQUEST_GET_CURRENT_CALLS的返回结果。
9.CdmaCallTracker的handleMessage被触发,处理时间EVENT_POLL_CALLS_RESULT,调用函数handlePollCalls
10.CdmaCallTracker.handlePollCalls调用phone.notifyNewRingingConnection(newRinging);
11.PhoneApp中创建CallNotifier
12.mPhone.registerForNewRingingConnection(this, PHONE_NEW_RINGING_CONNECTION, null);
13.CallNotifier.java,onNewRingingConnection()->startIncomingCallQuery()->startGetCallerInfo()
14.CallNofifier.java,onPhoneStateChanged()
15.InCallScreen.java,onPhoneStateChanged()
16.CallNotifier.java,onQueryComplete()->onCustomRingQueryComplete()(mRinger.ring()响铃,PhoneUtils.showIncomingCallUi()更新UI)
17.如果接通电话,则调用InCallScreen.java,handleOnscreenButtonClick()->internalAnswerCall()->PhoneUtils.answerCall(mPhone);(停止响铃,然后再接听电话)
18.CallNotifier.java,operationComplete()
18.状态改变InCallScreen.java,onPhoneStateChanged()更新界面,完成接听电话功能。
挂断电话的流程:
1.来电流程同上1-16。
2.拖动挂断界面InCallTouchUi.java,onTrigger()
2.InCallScreen.java,internalHangupRingingCall()->PhoneUtils.hangupRingingCall()->PhoneUtils.hangup()->
CdmaCall.hangup()
3.CdmaCallTracker.java,hangup()(先只看第一种情况)->cm.hangupWaitingOrBackground
4.RIL.java,hangupWaitingOrBackground()
注1:dialButtonPressed()函数,会启动一个intent.该intent的ACTION是ACTION_CALL_PRIVILEGED。我们在Intent.java中可以看到ACTION_CALL_PRIVILEGED实际上就是CALL_PRIVILEGED。在phone包下,查看AndroidManifest.xml可以看到<activity-alias />标签。这个标签的意思是说,这个Activity是另一个Activity的别名,真实的Activity在标签中用“android:targetActivity = OutgoingCallBroadcast”标出,所以 “ACTION_CALL_PRIVILEGED”启动的PrivilegedOutgoingCallBroadcast 所对应的真实“身份”是“OutgoingCallBroadcast”。
注2:InCallScreen.java
在首次oncreate后,就算通话结束也只会调用其onstop方法,此类一直不会被finish()掉。当onstop后,若重新打电话,则会调用onnewintent()方法,不会再经过oncreate。onCreate(第一次)增加FLAG参数:FLAG_DISMISS_KEYGUARD(这个参数的作用主要在于解除锁屏,比如锁屏时来电,这时候就需要先解除锁屏再显示画面,这样用户就能在锁屏时接收到来电了~)
InCallScreen布局及各个功能
(1)包含CallCard类:CallCard负责通话主要界面(callcard里面又包含call_card_person_info,这个就不细说了),如显示保持恢复按钮,电话头像,通话时间,通话号码 或 人名以及通话人头像。
(2)包含dtmf_twelve_key_dialer配置文件:主要负责通话中拨号键盘的布局
(3)包含InCallTouchUi这个重要的类:主要负责来电时的锁屏界面(往左滑是拒绝来电,往右滑是接听来电),该类继承SlidingTab来实现滑屏效果,后面会说到运 用 SlidingTab能实现自己的来电锁屏界面
(4)包含incallmenu类,主要负责MENU菜单的一些操作(如挂断电话,免提,合并通话等),虽然incallmenu负责MENU的绘画及布局,但是实际onclick后的操作是 由 incallscreen类来操控的
android打电话 接电话 挂电话流程分析相关推荐
- Android 源码 Camera2 预览流程分析四
<Android 源码 Camera2 预览流程分析二>中进行了流启动,这是调用 QCamera3Channel start() 方法实现的,对应于 HAL_PIXEL_FORMAT_YC ...
- android hook电话,Android之拨打接挂电话功能实现
手机是现代人们必不可少的工具之一,而使用得最多的就是拨打电话接听电话,本文通过一个简单的例子实现这个功能. 首先,加入我们的电话处理类 PhoneUtil.java package com.sl.ca ...
- Android7.0 Phone应用源码分析(四) phone挂断流程分析
电话挂断分为本地挂断和远程挂断,针对这两种情况各做分析 先来看下本地挂断电话的时序图:
- 全志 android 编译,全志A20启动代码流程分析 ——Android
现在的CPU都固化了内部 ROM,内部 ROM中有一般都有一段程序,一般有如下几个功能: 1,初始化,部分外设,如USB,SDCARD 2,初始化DDR(内存)和NandFlash 3,加载boot( ...
- Android系统开机到Launcher启动流程分析
本文基于Android10.0的源码. 由于google团队在对framework层代码进行大量重构,所以代码变动还是挺大的. 常见基础问题: SystemServer系统服务进程是如何创建的?Lau ...
- 全志android 编译,全志A20启动代码流程分析 ——Android
现在的CPU都固化了内部 ROM,内部 ROM中有一般都有一段程序,一般有如下几个功能: 1,初始化,部分外设,如USB,SDCARD 2,初始化DDR(内存)和NandFlash 3,加载boot( ...
- Android 9.0 开关机动画流程分析
Android开机动画流程的启动主要是在Surfaseflinger里面完成的,具体代码如下: /frameworks/native/services/surfaceflinger/StartProp ...
- Android Tel 拨打电话及来电流程分析
打电话流程 接下来分析一下打电话的流程.输入电话号码的流程这里忽略.输入电话号码之后会点击拨打图标.之后就会走拨打电话的流程了.这部分是在packages/apps/Dialer/src/com/an ...
- Android 7.0 APN 拨号上网流程分析
1.前言 在前段时间的项目中遇到客户的设备出现APN断开的情况没有自动连接,后来折腾了一段时间解决了这个问题.现在用这篇博客记录一下APN的选择和连接流程. 2.名词解析 APN:APN指一种网络接入 ...
最新文章
- 韩国为三星芯片数据硬刚美国,后者此前警告:不交就等着,后手有的是
- C#3.0官方编码规范
- 关于set sql_trace=ture 的一些用法
- 【Tools】Visual Studio 2019下载和安装
- IBASE Read buffer invalidate when locked
- 华为机试——字符串反转
- 唐山师范学院计算机科学与技术地址,2021年唐山师范学院有几个校区,大一新生在哪个校区...
- 苹果手机如何分享wifi密码_怎样用手机改wifi密码
- 如何把手机证件照压缩到15KB?手机压缩图片方法
- Top K Frequent Elements
- 目前人工智能的主要研究方向都有哪些?
- Warshall算法C语言实现
- 「macOS无法验证此APP不包含恶意软件」的处理方式
- GSM模块_常用AT指令详解
- c 语言 批量更改文件名,rename 批量修改文件名
- SPARQL基础知识
- 数据分析模型篇—SWOT分析
- 微型计算机抽象原理,微机自动检测系统的结构原理及功能设计
- Eclipse 创建 Hello World 工程
- MyBatis一对多与多对一