来电时系统级别会发生什么?

2024-02-16

我已经从以下位置下载了 master 分支的完整源代码https://android.googlesource.com/platform/frameworks/base/+/master https://android.googlesource.com/platform/frameworks/base/+/master,并且正在尝试破译来电的事件链。

我假设 ACTION_ANSWER 意图已启动,但除此之外不知道之前或之后发生了什么。

有人可以帮忙吗?


让我们首先看一下呼叫通知程序 http://androidxref.com/4.4.2_r1/xref/packages/services/Telephony/src/com/android/phone/CallNotifier.java:

/** * 监听手机状态变化的手机应用模块 来自电话层的各种其他*事件,并触发任何 产生的 UI 行为 *(例如启动振铃器和来电 UI、播放通话铃声、*更新通知、写入通话记录 条目等)*/

该处理程序响应的消息之一是:CallStateMonitor.PHONE_NEW_RINGING_CONNECTION:

case CallStateMonitor.PHONE_NEW_RINGING_CONNECTION:
    log("RINGING... (new)");
    onNewRingingConnection((AsyncResult) msg.obj);
    mSilentRingerRequested = false;
    break;

onNewRingingConnection(AsyncResult)最终(并且在一般情况下)调用ringAndNotifyOfIncomingCall(Connection c):

private void ringAndNotifyOfIncomingCall(Connection c) {
    if (PhoneUtils.isRealIncomingCall(c.getState())) {
        mRinger.ring();
    } else {
        if (VDBG) log("- starting call waiting tone...");
            if (mCallWaitingTonePlayer == null) {
                mCallWaitingTonePlayer = new InCallTonePlayer(
                                         InCallTonePlayer.TONE_CALL_WAITING);
                mCallWaitingTonePlayer.start();
            }
    }

    // CallModeler.onNewRingingConnection(Connection)
    mCallModeler.onNewRingingConnection(c);
}

CallModeler.onNewRingingConnection(Connection) (Link http://androidxref.com/4.4.2_r1/xref/packages/services/Telephony/src/com/android/phone/CallModeler.java#onNewRingingConnection) 通知附加的侦听器:

for (int i = 0; i < mListeners.size(); ++i) {
    mListeners.get(i).onIncoming(call);
}

这些监听器实现CallModeler.Listener界面。调用处理服务代理 http://androidxref.com/4.4.2_r1/xref/packages/services/Telephony/src/com/android/phone/CallHandlerServiceProxy.java就是这样的听众之一,它的onIncoming(Call)回调触发CallHandlerServiceProxy.processIncoming(Call):

private void processIncoming(Call call) {
    ....
    // ICallHandlerService
    mCallHandlerServiceGuarded.onIncoming(call,
                   RejectWithTextMessageManager.loadCannedResponses());
    ....
}

调用处理服务 http://androidxref.com/4.4.2_r1/xref/packages/apps/InCallUI/src/com/android/incallui/CallHandlerService.java定义了一个ICallHandlerService.Stub成员及其onIncoming(Call, List<String>)方法如下:

@Override
public void onIncoming(Call call, List<String> textResponses) {
    ....
    mMainHandler.sendMessage(mMainHandler.obtainMessage(
                   ON_UPDATE_CALL_WITH_TEXT_RESPONSES, incomingCall));
    ....
}

就是这样mMainHandler处理案件ON_UPDATE_CALL_WITH_TEXT_RESPONSES:

case ON_UPDATE_CALL_WITH_TEXT_RESPONSES:
    AbstractMap.SimpleEntry<Call, List<String>> entry
                   = (AbstractMap.SimpleEntry<Call, List<String>>) msg.obj;
    Log.i(TAG, "ON_INCOMING_CALL: " + entry.getKey());

    // CallList
    mCallList.onIncoming(entry.getKey(), entry.getValue());
    break;

CallList http://androidxref.com/4.4.2_r1/xref/packages/apps/InCallUI/src/com/android/incallui/CallList.java保留实现的侦听器列表CallList.Listener,并发射他们的onIncomingCall(Call)事件来自其CallList.onIncoming(Call, List<String>) method.

现在,让我们看看通话中演示者 http://androidxref.com/4.4.2_r1/xref/packages/apps/InCallUI/src/com/android/incallui/InCallPresenter.java:

/** * 从 CallList 获取更新并通知 InCallActivity (UI) * 的更改。 * 负责启动一个活动 新呼叫并在所有呼叫 * 均已完成时完成活动 已断开连接。 * 创建和管理通话状态并提供 想要收听的演示者的侦听器模式* 通话中状态变化。 * TODO:这个类已经变得更像是一个状态 此时机器。考虑重命名。 */

InCallPresenter实施CallList.Listener接口,并负责启动InCallActivity为所有电话相关操作提供 UI。以下评论(摘自InCallPresenter.startOrFinishUi(InCallState)) 将上述事件链整合在一起:

/* A new Incoming call means that the user needs to be notified of the
   the call (since it wasn't them who initiated it).  We do this 
   through full  screen notifications and happens indirectly through {@link 
   StatusBarListener}. The process for incoming calls is as follows:

   1) CallList          - Announces existence of new INCOMING call
   2) InCallPresenter   - Gets announcement and calculates that the new 
                          InCallState should be set to INCOMING.
   3) InCallPresenter   - This method is called to see if we need to 
                          start or finish the app given the new state.
   4) StatusBarNotifier - Listens to InCallState changes. InCallPresenter 
                          calls StatusBarNotifier explicitly to issue a 
                          FullScreen Notification that will either start the
                          InCallActivity or show the user a top-level 
                          notification dialog if the user is in 
                          an immersive app. That notification can also start 
                          the InCallActivity.         
   5) InCallActivity    - Main activity starts up and at the end of its 
                          onCreate will call InCallPresenter::setActivity() 
                          to let the presenter know that start-up is complete.
                  [ AND NOW YOU'RE IN THE CALL. voila! ] */

我希望这能回答您的问题,或者至少告诉您该去哪里寻找。请随意纠正我忽略/误解的任何内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来电时系统级别会发生什么? 的相关文章

随机推荐

  • 使用 CLASSIC ASP 将数据返回到 jsonp 调用

    我已经浏览了 stackoverflow 上的帖子 但似乎找不到我要找的东西 如果我这样做 表格 ajaxSettings dataType jsonp get http MYREMOTESERVER com GetCustNewID as
  • C# 检查网络状态

    如何检查我是否有开放的网络连接并且可以联系 C 中的特定 IP 地址 我在 VB Net 中见过示例 但它们都使用 My 结构 谢谢 如果您只想检查网络是否正常 请使用 bool networkUp System Net NetworkIn
  • 为什么“rails runner -e production”不起作用?

    为了解决我的问题 该问题在 生产中的 will paginate 错误未定义方法 paginate https stackoverflow com questions 19577344 will paginate error in prod
  • 如何使用查找和替换在 Xcode 中用单个新行替换多个新行

    在Xcode项目中 我们编写程序时一般不会关注行间距 那么编码完成后 如何用一行删除所有多余的换行符呢 在文本搜索字段中 可以使用以下方法进行多行 非打印字符 搜索 替换 假设我想替换所有实例 This is a comment with
  • 我的 Cocos2D-iPhone 游戏可以支持 VoiceOver 吗?

    我正在制作一款游戏 玩家通过动作对声音做出反应 由于玩游戏不需要视觉元素 而且许多人都是闭着眼睛玩的 所以不完全兼容 VoiceOver 似乎很遗憾 我目前正在使用 Cocos2D iPhone 和 CocosDenshion 来处理音频
  • php图像显示无需在邮件中下载

    您好 我想使用 php 邮件程序类发送 html 格式的图像 但图像下载后显示在邮件中 但我想显示图像而不下载 邮件程序类中是否有任何选项或者有另一种方法 或者我必须以其他格式发送图像 好吧 可能的答案只有两种 您不想在电子邮件中嵌入实际的
  • 使用 IO 在 C# 中读取十六进制

    我是从 Java 转向 C 的新手 我正在尝试使用十六进制 IO 读取文件 当我读取第一个字节时 我看不到我在十六进制编辑器中看到的内容 我在用着 StreamReader reader new StreamReader fileDirec
  • 如何获得与 Apple 推送通知一起播放的自定义声音?

    我正在尝试在发送 Apple 推送通知时播放自定义声音 显示弹出消息 徽章也会更新 但我总是播放默认的 iPhone 声音 而不是我的自定义声音 这是我发送的 JSON 数据 aps sound sound caf badge 2 aler
  • 将值返回给不同的 Activity

    我有一个应用程序 基本上看起来像附图中的设计 可以看到 有4个Activity 部分Activity有碎片 我想将测试的答案返回到用户的个人资料中 到目前为止 我一直将结果上传到服务器 并让应用程序在用户每次返回时更新用户的个人资料简介活动
  • ng-repeat 过滤器“显示所有”项目(如果未选择过滤器)

    我有一个ng repeat过滤器使用
  • iOS 7 UIWebView 键盘问题

    我必须像这里一样删除这个栏link https stackoverflow com questions 13101642 ios keyboard style in webview但对于 iOS 7 此代码不起作用 我们通过一些 Objec
  • 忽略触发器中的错误

    我有一个存储过程 在插入 更新 删除时的触发器内调用 问题是这个 SP 中有一个不重要的代码块 因此我想忽略此代码块引起的任何错误 我将此代码块插入到 TRY CATCH 块中 但令我惊讶的是我收到了以下错误 当前事务无法提交 并且无法支持
  • 如何在 AWS Step Function 中获取纪元时间

    我们可以使用 State EnteredTime 引用AWS Step函数中的当前时间 但这给出了ISO格式 有没有办法获取纪元秒 毫秒 我想基于此在 DynamoDB 中添加 TTL 值 这可能吗 或者我是否必须仅为时间戳调用 Lambd
  • 观察对象的所有元素(除了一个元素)

    我的代码中有一块手表 scope watch foo function true 这确保了如果对象 foo 中的任何属性发生更改 则将调用此监视 我想对此破例 如果 foo 中除一个属性之外的任何属性发生更改 我想调用此监视 如果该属性发生
  • 如何使用从密码派生的密钥正确加密和解​​密文件

    我正在尝试找出使用 PBEWithHmacSHA256AndAES 256 标准加密和解密文件的正确过程 据我了解 看这个示例代码 https docs oracle com javase 8 docs technotes guides s
  • 如何从文件中获取 Unix 权限掩码? [复制]

    这个问题在这里已经有答案了 如何使用 python 在 nix 上获取文件的权限掩码 例如 644 或 755 有没有任何函数或类可以做到这一点 非常感谢 os stat是一个包装器stat 2 http linux die net man
  • 谷歌绘图 API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种方法来创建谷歌绘图 https docs google com drawings通过 A
  • docker 存储库名称组件必须匹配

    我正在尝试使用此插件构建我的图像 https github com spotify docker maven plugin use a dockerfile https github com spotify docker maven plu
  • 使用jetpack导航将自定义过渡动画添加到底部导航设置

    我正在开发一个使用 jetpack 组件的应用程序 我用三个片段缝合了底部导航 如guide https developer android com topic libraries architecture navigation navig
  • 来电时系统级别会发生什么?

    我已经从以下位置下载了 master 分支的完整源代码https android googlesource com platform frameworks base master https android googlesource com