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

    android打电话过程: 1.TwelveKeyDialer.java,onKeyDown()->dialButtonPressed() 2.OutgoingCallBroadcaster.j ...

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

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

  3. adb应用之打电话,挂电话

    打电话: 1. adb shell service call phone 2 s16 "10086" 2. adb shell am start -a android.intent ...

  4. pc 电脑web浏览器js通过usb控制安卓手机打电话挂电话(补充效果录像图)

    pc 电脑web浏览器js通过usb控制安卓手机打电话挂电话 经过几年的沉淀,我们已经将整个这个需求背景的架构与解决方案进行了高级的研发,将在下一个文档中进行概述. 电脑通过网页通过控制usb的安卓手 ...

  5. android自动回复退订,Android实现短信自动回复,挂电话

    原标题:Android实现短信自动回复,挂电话 简单功能,配置一下ITelephoney,ITelephony这个接口不能直接用的. 需要先在src下新建包com.android.internal.t ...

  6. android自动接听和挂断电话

    实现android自动接听和挂断电话功能.代码如下: 添加权限 <uses-permission android:name="android.permission.CALL_PHONE ...

  7. android远程打电话,Android打电话功能 Android实战教程第三篇之简单实现拨打电话功能...

    想了解Android实战教程第三篇之简单实现拨打电话功能的相关内容吗,杨道龙在本文为您仔细讲解Android打电话功能的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Android拨打电话 ...

  8. android实现打电话功能,Android之简单实现拨打电话功能的方法

    手机在我们的日常生活中是最常见的,它的功能是拨打电话和发送短信,那么在Android开发中,我们如何通过该程序拨打电话呢?爱站技术频道给出了Android之简单实现拨打电话功能的方法,一起来看看吧! ...

  9. android 自动挂断,android实现接通和挂断电话

    本文实例为大家分享了android实现接通和挂断电话的具体代码,供大家参考,具体内容如下 关键代码:[PhoneUtils类] package com.ebupt.phonerecorddemo.se ...

最新文章

  1. 正确预测适合自己的职业
  2. ASP.NET MVC Model绑定小结
  3. Infiniband网络抓包
  4. 优学院java架构52破解_[单选] 肢体根据需要采用气囊止血带上肢压力至()
  5. 单例模式volatile
  6. Ospf在广播网络中建立邻居关系的详细过程
  7. [导入][你必须知道的.NET]第十回:品味类型---值类型与引用类型(下)-应用征途...
  8. Draconian,自由或保姆状态:Java,C#,C,C ++,Go和Rust中的并发意识形态
  9. c# 第七节 编程规范,vs中的各种设置
  10. 想自学python看哪位的视频比较好-python学习视频好的有哪些
  11. 使用wget抓取网站资源
  12. c语言 指针 地址溢出,堆栈溢出,指针在C中
  13. 【计算理论】计算理论总结 ( 上下文无关文法 ) ★★
  14. 用python爬虫,pyinstaller写一个属于自己的彩虹屁生成器!(链接在文末自取)
  15. ansys19.0安装破解教程(图文详解)
  16. jquery常用方法之siblings方法
  17. HTTP 错误 404.0 - Not Found
  18. 智慧医疗BI助你释放医疗大数据潜力
  19. 【NOIP2014】解方程【秦九韶】【高精度处理】
  20. 让 Vivado有Zybo Board的配置文件

热门文章

  1. 当SEA变成了BADA,让我们高呼女王万岁
  2. xss漏洞利用方式总结
  3. Java、JSP基于web的运动会管理系统的设计与实现
  4. Linux系统中端口映射是什么意思?
  5. m基于K-means聚类算法和神经网络的模糊控制器设计matlab仿真
  6. 前端优化之回流(Reflow)与重绘(Repaint)
  7. 你的芯片,能抵挡住几次攻击?
  8. 《Spring揭秘》读书笔记 2:Spring AOP
  9. java mysql选择题_MySQL选择填空基础题
  10. 管家婆SQL SERVER数据库修复案例