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打电话 接电话 挂电话流程分析相关推荐

  1. Android 源码 Camera2 预览流程分析四

    <Android 源码 Camera2 预览流程分析二>中进行了流启动,这是调用 QCamera3Channel start() 方法实现的,对应于 HAL_PIXEL_FORMAT_YC ...

  2. android hook电话,Android之拨打接挂电话功能实现

    手机是现代人们必不可少的工具之一,而使用得最多的就是拨打电话接听电话,本文通过一个简单的例子实现这个功能. 首先,加入我们的电话处理类 PhoneUtil.java package com.sl.ca ...

  3. Android7.0 Phone应用源码分析(四) phone挂断流程分析

    电话挂断分为本地挂断和远程挂断,针对这两种情况各做分析 先来看下本地挂断电话的时序图:

  4. 全志 android 编译,全志A20启动代码流程分析 ——Android

    现在的CPU都固化了内部 ROM,内部 ROM中有一般都有一段程序,一般有如下几个功能: 1,初始化,部分外设,如USB,SDCARD 2,初始化DDR(内存)和NandFlash 3,加载boot( ...

  5. Android系统开机到Launcher启动流程分析

    本文基于Android10.0的源码. 由于google团队在对framework层代码进行大量重构,所以代码变动还是挺大的. 常见基础问题: SystemServer系统服务进程是如何创建的?Lau ...

  6. 全志android 编译,全志A20启动代码流程分析 ——Android

    现在的CPU都固化了内部 ROM,内部 ROM中有一般都有一段程序,一般有如下几个功能: 1,初始化,部分外设,如USB,SDCARD 2,初始化DDR(内存)和NandFlash 3,加载boot( ...

  7. Android 9.0 开关机动画流程分析

    Android开机动画流程的启动主要是在Surfaseflinger里面完成的,具体代码如下: /frameworks/native/services/surfaceflinger/StartProp ...

  8. Android Tel 拨打电话及来电流程分析

    打电话流程 接下来分析一下打电话的流程.输入电话号码的流程这里忽略.输入电话号码之后会点击拨打图标.之后就会走拨打电话的流程了.这部分是在packages/apps/Dialer/src/com/an ...

  9. Android 7.0 APN 拨号上网流程分析

    1.前言 在前段时间的项目中遇到客户的设备出现APN断开的情况没有自动连接,后来折腾了一段时间解决了这个问题.现在用这篇博客记录一下APN的选择和连接流程. 2.名词解析 APN:APN指一种网络接入 ...

最新文章

  1. 韩国为三星芯片数据硬刚美国,后者此前警告:不交就等着,后手有的是
  2. C#3.0官方编码规范
  3. 关于set sql_trace=ture 的一些用法
  4. 【Tools】Visual Studio 2019下载和安装
  5. IBASE Read buffer invalidate when locked
  6. 华为机试——字符串反转
  7. 唐山师范学院计算机科学与技术地址,2021年唐山师范学院有几个校区,大一新生在哪个校区...
  8. 苹果手机如何分享wifi密码_怎样用手机改wifi密码
  9. 如何把手机证件照压缩到15KB?手机压缩图片方法
  10. Top K Frequent Elements
  11. 目前人工智能的主要研究方向都有哪些?
  12. Warshall算法C语言实现
  13. 「macOS无法验证此APP不包含恶意软件」的处理方式
  14. GSM模块_常用AT指令详解
  15. c 语言 批量更改文件名,rename 批量修改文件名
  16. SPARQL基础知识
  17. 数据分析模型篇—SWOT分析
  18. 微型计算机抽象原理,微机自动检测系统的结构原理及功能设计
  19. Eclipse 创建 Hello World 工程
  20. MyBatis一对多与多对一

热门文章

  1. Python去除字符串中空格(删除指定字符)的3种方法
  2. anaconda点开后 一直停留在 loading applications 上面
  3. SVN本地目录创建及使用
  4. 案例式C语言程序设计pdf
  5. idea调整代码标签编辑器标签editor tabs的横排和竖排
  6. R语言和Rstudio下载 以及 R 包安装
  7. 美股当红炸子鸡Zoom“不务正业”卖硬件,这背后藏着它什么野心?
  8. 飞翔的小鸟--Java小游戏实战(代码完整)
  9. 无人超市仓库管理论系统
  10. Mac 命令行中操作剪切板