来新公司已经很长时间了,不过接触android还是不久以前的事情,由于项目的需要,我得了解下接电话的流程,网上查了很多的资料,发现很多都是打电话的流程比较详细,但接电话的流程,特别是RIL.java往上的部分都不是很详细,于是,我自己跟踪了下,就把过程贴了出来,可能有些地方不全,也可能i会有不对的地方,请各位指教

接电话的基本流程(java层):

首先,通过ddms拨打模拟器的电话,这样
在RIL.java的RILReceiver线程(run()函数中)当中接收到rild发来的incoming消息,接收线程将消息转给processResponse(p)进行处理,processResponse(p)又将消息转给processUnsolicited (p)处理,然后又转到

case RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:
                if (RILJ_LOGD) unsljLog(response);
                mCallStateRegistrants
                    .notifyRegistrants(new AsyncResult(null, null, null));
            break;
进行处理。这样消息就转到了mCallStateRegistrants(RegistrantList.java类中)的notifyRegistrants()函数进行处理了,接着转到internalNotifyRegistrants(ar.result, ar.exception);
消息继续上传到
            Registrant  r = (Registrant) registrants.get(i);
            r.internalNotifyRegistrant(result, exception);

internalNotifyRegistrant的函数如下所示:

internalNotifyRegistrant (Object result, Throwable exception)
    {
        Handler h = getHandler();

if (h == null) {
            clear();
        } else {
            Message msg = Message.obtain();

msg.what = what;
           
            msg.obj = new AsyncResult(userObj, result, exception);
           
            h.sendMessage(msg);
        }
    }

注意到消息是由Handler类型的h发出的。好了

我们来看Handler
在Handler中含有如下函数(只是没有什么实现而已)
handleMessage(Message msg)
这就好说了,接着我们看消息怎么上传的吧:
我们以GSM类型的Phone为例
找到CallTracker类,我们发现这个类是由Handler继承而来的,于是我们查看下其handleMessage(Message msg)函数,发现该函数还是没有什么实现(刚看了下原来该这是个抽象类,汗。。。)
不用着急,继续往下找,我们发现GsmCallTracker类是继承自CallTracker类的,看GsmCallTracker的名字,我们应该知道这个类是做什么用的了吧。
找到handleMessage(Message msg)函数,其中有如下语句:
            case EVENT_REPOLL_AFTER_DELAY:
            case EVENT_CALL_STATE_CHANGE:
                pollCallsWhenSafe();
            break;
注意第二个case语句,有电话来了,那么call的状态自然是要改变的,呵呵。
于是,转到 pollCallsWhenSafe()进行处理。

在CallTracker类中,pollCallsWhenSafe()函数是的实现如下

protected void pollCallsWhenSafe() {
        needsPoll = true;

if (checkNoOperationsPending()) {
            lastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT);
            cm.getCurrentCalls(lastRelevantPoll);
        }
    }

其中 public CommandsInterface cm;
于是,转到RIL.java的

public void
    getCurrentCalls (Message result) {
        RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_CURRENT_CALLS, result);

if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));

send(rr);
    }
执行

这样,消息就往底层下发了,详细过程,我不解释,当消息处理完后,RIL.java的接收线程又会收到相应的消息

进入processSolicited (Parcel p)处理,然后消息进入GsmCallTracker类的
case:EVENT_POLL_CALLS_RESULT进行处理---->handlePollCalls(AsyncResult ar)---->消息经过发送和接收后进入
            case EVENT_REPOLL_AFTER_DELAY:
            case EVENT_CALL_STATE_CHANGE:
                pollCallsWhenSafe();
------>................消息太多,自己去跟踪吧
------>handlePollCalls((AsyncResult)msg.obj);
------>pollCallsWhenSafe();
接通电话,则进入下面的函数执行
------>operationComplete();
进入App层处理,找下CallNotifier.java的handleMessage()函数,在接下来的过程当中,就比较好跟踪了,我也懒得写了。

以下部分为查看日志得到的过程,可能存在错误

CallNotifier.java收到incoming消息后转到handleMessage()进行处理;handleMessage()将incoming消息传给onNewRingingConnection()函数进行处理;在onNewRingingConnection()函数中首先建立ringing连接,获取Call.State状态为INCOMING,然后通过PhoneApp的requestWakeState()函数唤起相应的状态(PARTIAL);然后移除PHONE_AUTO_ANSWER消息;接着执行startIncomingCallQuery(c);在函数startIncomingCallQuery中通过PhoneUtils的startGetCallerInfo()函数获取Caller的相关信息;这样就完成了ringing的连接;同时就完成了incoming状态的一个改变,进一步在CallNotifier的hangdleMessage中调用onPhoneStateChanged()函数处理相关状态的改变(包括通知PhoneApp状态改变,通知InCallScreen状态改变)。InCallScreen受到状态改变的消息后在handleMessage中对之进行处理,即要调用InCallScreen的onPhoneStateChanged()函数进行处理。回到CallNotifier.java中,当handleMessage()处理onCustomRingQueryComplete(),在该函数中会调用Ringer.java的响铃函数进行铃声通知ring(),接着再调用PhoneUtils.showIncomingCallUi();显示UI(通过调用PhoneApp类的displayCallScreen()函数)。下一步,如果接通电话,则走如下流程:
首先更新UI显示(调用CallCard.java的相关函数),然后进入InCallScreen的消息处理,接着进入PhoneUtils的answerCall()函数,在此函数中,会首先通过
PhoneApp.getInstance().getRinger().stopRing();停止响铃,然后更新UI页面。

Android接电话流程,JAVA部分相关推荐

  1. Android接电话流程、Phone来电过程、phone上层来电话解析 接通电话

    汇聚下,别人对来电的分析: http://blog.csdn.net/ninedays/article/details/5969215 接电话的基本流程(java层): 首先,通过ddms拨打模拟器的 ...

  2. Android呼出电话流程(原)

    一.应用层的流程 1.1.拨号盘初步处理 [java] view plaincopy @DialpadFragment.java public void dialButtonPressed() { / ...

  3. Android 10 拨打电话流程

    接续上一章节,理解Android 10 拨打电话流程 packages/apps/Dialer/java/com/android/dialer/dialpadview/DialpadFragment. ...

  4. android 通话的log分析,Android Telephony 接电话流程分析

    写在前面的话 本文主要分析Android 接电话的流程,研究的代码是Android 4.4的,现在我们只关注framework层,以CDMA为例,GSM同理. 如果图片看不清的话,可以右键选择在新标签 ...

  5. Java模拟拨打电话程序_java_编写android拨打电话apk应用实例代码,android 实现拨打电话的app,代 - phpStudy...

    编写android拨打电话apk应用实例代码 android 实现拨打电话的app,代码非常简单,功能也很实用,分享给大家. MainActivity.java package com.bblei.c ...

  6. Android 蓝牙启动流程(以及设置蓝牙为作为sink模式 接收端模式)

    本文以Android 7.1为基础 最近在做蓝牙开发,研究了一下蓝牙的启动流程,总结一下 Google在Android源码中推出了它和博通公司一起开发的BlueDroid以替代BlueZ.BlueZ的 ...

  7. android 关机 流程_android 关机 流程分析

    2011-08-26 11:30 1340人阅读 评论(0) 嵌入式系统一般都有一个关机按键,长按这个按键系统会弹出关机对话框,提示关机确认, 关机动作从按键触发中断,linux kernel层给an ...

  8. android 关机 流程_android系统关机流程分析

    关机动作从按键触发中断,linux kernel层给android framework层返回按键事件进入  framework层,再从 framework层到kernel层执行kernel层关机任务. ...

  9. 【Android 逆向】加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程

    文章目录 一.加壳的 Android 应用启动流程 二.使用反射替换 LoadedApk 中的类加载器流程 一.加壳的 Android 应用启动流程 加壳的 Android 应用启动流程 : 加壳的 ...

最新文章

  1. Spring AOP详解(转载)所需要的包
  2. gin获取路径中的参数
  3. 编译问题二 /snmplib/tools.c:920 undefined reference to `clock_gettime' 问题解决
  4. 4.2 Tensorflow笔记:池化函数
  5. centos7 服务器上的tomcat快速安装
  6. 2020年信息系统项目管理师真题讲解:基础知识1/3
  7. wpf template的code写法
  8. 【分享】【养生】消灭小肚腩
  9. 光流 | OpenCV实现简单的optical flow(代码类)
  10. 第四话 想不到办法,就研究规律 ver1.0
  11. C# 重绘tabControl,添加关闭按钮(续)
  12. gitlab bash_如何编写Bash一线式以克隆和管理GitHub和GitLab存储库
  13. python与linux关系_如何处理Linux / Python依赖关系?
  14. oracle数据库中sql%notfound的用法
  15. windows下vbs脚本添加网络打印机
  16. 高等代数期末考试题库及答案_高等代数3学时试题题目及答案,课程2021最新期末考试题库,章节测验答案...
  17. Beta 冲刺(7/7)
  18. 深蓝学院机器人学中的状态估计课程
  19. 数据库mysql视频马士兵,马士兵mysql视频的个人笔记
  20. 递归解决字符串逆序输出

热门文章

  1. 4款黑科技级别的宝藏APP,能够轻松满足你的多种需求,请低调收藏
  2. 把自己开发的Mac软件提交给苹果官网下载频道的方法
  3. 《Semi-supervised Medical Image Segmentation Using Cross-Model Pseudo-Supervision with Shape Awarene》
  4. C语言学习:用C语言实现简单的计算器
  5. CSDN博文字体设置 | 字体颜色、大小设置 | 简记 |
  6. 【HNOI2004】【BZOJ1213】高精度开根
  7. JS判断Android手机型号
  8. Open-Falcon 配置参数概述
  9. pycharm怎么改成中文(汉化插件 pycharm自带)
  10. js调用摄像头并截图