android 之 CALL

一、組件職責與定位

組件所在進程核心職責關鍵特性
CallsManagerTelecom系統進程通話狀態機核心:管理所有Call對象的生命周期(創建、狀態更新、銷毀)。監聽Call狀態變化并通知所有觀察者(如InCallController)。通過mListeners集合維護觀察者列表(如InCallControllerRinger等)。
InCallControllerTelecom系統進程跨進程通信橋梁:監聽CallsManager的Call事件,綁定InCallService服務(如InCallServiceImpl)。將Call狀態封裝為ParcelableCall對象傳遞給UI進程。通過bindServiceAsUser()綁定InCallService,觸發UI進程啟動。
InCallPresenterDialer應用進程MVP模式中的Presenter:接收InCallService的Call狀態更新,控制InCallActivity的創建/銷毀。管理子Presenter(如CallCardPresenter)和界面邏輯。通過InCallAdapter將用戶操作(接聽/掛斷)轉發給CallsManager
InCallActivityDialer應用進程界面容器:承載通話UI的Activity,動態加載Fragment(如CallCardFragment)。僅響應界面事件,業務邏輯委托給InCallPresenter布局僅為FrameLayout,具體UI由Fragment實現。

二、核心交互流程(以去電MO為例)

  1. Call創建與狀態同步

    • CallsManager創建Call對象,觸發onCallAdded回調。
    • InCallController監聽到事件,綁定InCallService服務(跨進程)。
    • 綁定成功后,InCallServiceImpl通知InCallPresenter啟動InCallActivity
  2. 界面啟動與用戶操作

    • InCallPresenter調用startActivity()啟動InCallActivity,加載通話UI。
    • 用戶點擊“撥號”后,InCallPresenter通過InCallAdapter調用CallsManager.placeOutgoingCall()
  3. 底層通話建立

    • CallsManager通過ConnectionService與Modem交互,Call狀態變為DIALINGACTIVE
    • 狀態變化經InCallController同步至UI進程,觸發InCallPresenter更新界面(如顯示通話計時)。
用戶操作 InCallActivity InCallPresenter InCallAdapter CallsManager InCallController InCallService 點擊撥號 onUserAction(撥號) placeOutgoingCall() placeOutgoingCall() 更新Call狀態 onCallAdded(Call) addCall(ParcelableCall) onCallAdded() 刷新界面(計時/狀態) 用戶操作 InCallActivity InCallPresenter InCallAdapter CallsManager InCallController InCallService

三、與Call對象的交互關系

  1. Call的生命周期管理

    • 創建CallsManager在去電/來電時創建Call對象,分配唯一ID。
    • 狀態流轉:Call狀態(DIALINGRINGINGACTIVE等)由CallsManager驅動,通過setCallState()更新。
    • 銷毀:通話結束時,CallsManager移除Call并觸發onCallRemoved
  2. Call數據的跨進程傳遞

    • InCallController將Call轉換為ParcelableCall(可序列化對象),通過Binder傳遞至UI進程。
    • InCallPresenter解析ParcelableCall,更新界面元素(如聯系人姓名、通話時長)。
  3. 用戶操作與Call狀態聯動

    • 接聽/掛斷等操作通過InCallAdapter回調至CallsManager,后者調用Call.answer()Call.disconnect()
    • 狀態變化反向同步至UI,形成閉環(例如掛斷后界面關閉)。

四、設計特點與架構價值

  1. 分層解耦

    • 上層(UI層)InCallActivity僅負責渲染,InCallPresenter處理邏輯,符合MVP模式。
    • 下層(服務層)CallsManager專注狀態機,InCallController處理跨進程通信。
  2. 跨進程高效同步

    • 通過Binder機制實現Telecom進程與Dialer進程的實時狀態同步(ParcelableCall序列化)。
  3. 可擴展性

    • CallsManager的監聽器模式支持動態添加組件(如Ringer振鈴模塊、CallAudioManager音頻控制)。
    • InCallPresenter可管理多類子Presenter,適應不同通話場景(如視頻通話、會議)。

五、鏈路

這一架構通過狀態驅動CallsManager)與界面邏輯分離(MVP模式)實現高內聚低耦合:

  • 核心鏈路CallsManager → InCallController → InCallPresenter → InCallActivity 構成狀態傳遞閉環;
  • 交互本質:Call對象作為載體,在進程間傳遞狀態,驅動UI與底層服務協同。
    其設計充分體現了Android系統服務的模塊化思想,為通話功能提供了穩定可擴展的基礎。

六、Call 狀態

1. DIALING(撥號中)
  • 定義:用戶發起呼叫后,系統開始連接對方但尚未接通的階段。
  • 觸發時機
    • 用戶撥號后立即進入此狀態,無論是否開始響鈴。
    • 若需選擇通話賬戶(如VoIP或SIM卡),會先進入SELECT_PHONE_ACCOUNT狀態,確認后轉為DIALING
  • 行為特征
    • 主叫方聽回鈴音或等待提示音,被叫方設備未響鈴。
    • 若撥號失敗(如無信號),會轉為DISCONNECTED(連接斷開)。
2. RINGING(響鈴中)
  • 定義:被叫方收到來電請求,設備開始響鈴或震動的狀態。
  • 觸發時機
    • 主叫方撥號后,被叫方網絡收到呼叫請求時觸發。
    • 若被叫方正在通話中,此狀態可能伴隨CALL_WAITING(呼叫等待)提示。
  • 行為特征
    • 被叫方設備響鈴,顯示來電界面。
    • 主叫方仍處于DIALING狀態,直至被叫方接聽。
3. ACTIVE(通話中)
  • 定義:雙方已建立連接,可實時雙向通話。
  • 觸發時機
    • 被叫方接聽來電后,主被叫雙方均進入此狀態。
    • HOLDING(通話保持)狀態恢復時也會切換至此。
  • 行為特征
    • 通話計時器啟動,界面顯示通話時長。
    • 支持操作如靜音(MUTE)、保持(HOLD)、多方通話等。
4. HOLDING(保持中)
  • 通話被主動暫停(如接聽新來電),雙方暫時中斷語音連接。
  • 界面顯示“已保持”,恢復后回到ACTIVE
5. DISCONNECTING(斷開中)
  • 用戶掛斷電話后,系統釋放資源的中間狀態,隨后轉為DISCONNECTED
6. DISCONNECTED(已斷開)
  • 通話完全結束,資源已釋放。界面顯示掛斷提示(如通話時長總結)。
7. CALL_WAITING(呼叫等待)
  • 用戶通話中時第三方來電,當前通話保持,新來電進入RINGING狀態。
狀態轉換關系

通話狀態的典型生命周期流程如下:

被叫方響應
被叫方接聽
用戶點擊保持
恢復通話
掛斷
DIALING
RINGING
ACTIVE
HOLDING
DISCONNECTING
DISCONNECTED
  • 特殊場景
    • 通話保持時新來電:ACTIVE → HOLDING(原通話) + RINGING(新來電)。
    • 撥號失敗:DIALING → DISCONNECTED
各個層的差異
DriverCall.StateCall.State(opt/telephony)Connection.State(base/telecomm)CallState(services/Telecomm)Call.State(base/telecomm)Call.State(Dialler)
ACTIVEACTIVESTATE_ACTIVEACTIVESTATE_ACTIVEACTIVE
HOLDINGHOLDINGSTATE_HOLDINGON_HOLDSTATE_HOLDINGONHOLD
DIALINGDIALINGSTATE_DIALINGDIALINGSTATE_DIALINGDIALING
ALERTINGALERTINGRINGALERTING
INCOMINGINCOMINGSTATE_RINGINGRINGINGSTATE_RINGINGINCOMING
WAITINGWAITINGCALL_WAITING
IDLEIDLE
DISCONNECTEDSTATE_DISCONNECTEDDISCONNECTEDSTATE_DISCONNECTEDDISCONNECTED
DISCONNECTINGDISCONNECTINGSTATE_DISCONNECTINGDISCONNECTING
STATE_INITIALIZINGCONNECTINGSTATE_CONNECTINGCONNECTING
STATE_NEWNEWSTATE_NEW
STATE_PULLING_CALLSTATE_PULLING_CALL
SELECT_PHONE_ACCOUNTSTATE_SELECT_PHONE_ACCOUNTSELECT_PHONE_ACCOUNT
ABORTEDSTATE_DISCONNECTEDDISCONNECTED
STATE_PRE_DIAL_WAIT
INVALID
CONFERENCED
BLOCKED
WAIT_ACCOUNT_RESPONSE

七、MT 與 MO

在Android通話系統中,MO(Mobile Originated,移動始發)和MT(Mobile Terminated,移動終止) 分別指代用戶主動撥打電話(主叫)和接聽來電(被叫)的流程。

1. MO(去電流程)

定義:用戶主動發起呼叫的過程,即“撥打電話”。
核心步驟

  1. 撥號觸發:用戶在Dialer應用的撥號界面(DialpadFragment)點擊撥號按鈕,通過Intent.ACTION_CALL發起請求。
  2. 權限檢查
    • 系統檢查CALL_PHONE權限及默認撥號器身份(TelecomUtil.hasCallPhonePermission())。
    • 緊急呼叫(如ACTION_CALL_EMERGENCY)繞過權限限制。
  3. Telecom服務處理
    • TelecomServiceImpl.placeCall()驗證號碼合法性,并通過CallsManager創建通話對象(Call)。
  4. UI啟動與狀態更新
    • 系統啟動InCallActivity,根據通話狀態(如DIALING)顯示撥號界面。
    • 底層Modem返回DIALING狀態后,界面更新為撥號中。
  5. 呼叫建立
    • 被叫方接聽后,狀態轉為ACTIVE,通話計時開始。

流程圖簡化

在這里插入圖片描述

2. MT(來電流程)

定義:用戶接收來電并接聽的過程,即“接聽電話”。
核心步驟

  1. 來電通知
    • Modem檢測到來電,通過RIL層上報RINGING狀態至CallsManager
  2. 鈴聲與震動
    • CallNotifier調用Ringer播放鈴聲(非DIALING狀態獨有)。
  3. UI啟動
    • 系統啟動InCallActivity,顯示來電界面(如聯系人信息、接聽/掛斷按鈕)。
  4. 用戶響應
    • 接聽:狀態轉為ACTIVE,建立雙向通話。
    • 拒接:狀態轉為DISCONNECTED

流程圖簡化

接聽
拒接
Modem上報來電
Ringer播放鈴聲
啟動InCallActivity
顯示RINGING界面
用戶操作
ACTIVE狀態
DISCONNECTED
3. MO與MT的核心區別
維度MO(主叫)MT(被叫)
觸發起點用戶主動撥號網絡側下發來電請求
關鍵狀態DIALING(撥號中)RINGING(響鈴中)
系統組件DialpadFragment觸發IntentRIL/CallsManager檢測來電狀態
特殊處理緊急呼叫權限繞過鈴聲播放(Ringer
VoLTE角色主叫UE構造SIP INVITE被叫S-CSCF觸發業務邏輯(如彩鈴)
注意點
  • MO:用戶撥號 → 權限檢查 → Telecom處理 → 界面顯示DIALING → 通話建立(ACTIVE)。
  • MT:網絡下發來電 → 播放鈴聲 → 界面顯示RINGING → 用戶接聽(ACTIVE)或拒接(DISCONNECTED)。
    本質差異在于觸發源(用戶主動 vs. 網絡被動)和核心狀態DIALING vs. RINGING)。理解兩者區別對開發通話功能、優化用戶體驗及設計測試用例至關重要。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83490.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83490.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83490.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Swift 6 學習筆記(二)The Basics

這篇筆記也是同步 Swift 6 官方教程中的第二篇 《The Basics》,這篇博客中的大部分內容在第一篇中已經涉及,這篇可以被認為是基礎類型的的補充篇,多了很多說明信息。 官方教學文檔 《The Basics》: Swift 提供了許多基本數據類型…

【PHP】BC Math 函數參考表

BC Math 函數參考表: 函數名描述語法bcadd兩個任意精度數字的加法bcadd($num1, $num2, [scale])bcsub兩個任意精度數字的減法bcsub($num1, $num2, [scale])bcmul兩個任意精度數字乘法bcmul($num1, $num2, [scale])bcdiv兩個任意精度數字除法bcdiv($num1, $num2, [scale])bcmod…

C# TAP異步編程(Task/async/await)總結

C#中有個很好用的東西,TAP異步編程(Task-based Asynchronous Pattern),是目前C#推薦的異步編程模型。它基于 System.Threading.Tasks.Task 和 async/await 關鍵字,旨在簡化異步代碼的編寫、調試和維護。TAP 是現代 .NE…

達夢數據庫(DM)用戶名大小寫處理規則

達夢數據庫(DM)用戶名大小寫處理規則 達夢數據庫對用戶名的處理與PostgreSQL和Oracle有所不同,以下是相關說明: 一、基本規則 默認情況下:達夢數據庫區分用戶名大小寫 創建的用戶名會保留原始大小寫格式連接時必須使用相同的大小寫形式 …

黑馬點評面試話術

文章目錄 1.項目介紹2. 分布式登錄功能2.1 講講登錄的整個流程2.2 集群模式session下存儲用戶信息會有啥問題?2.3 為什么采用redis存儲用戶信息和驗證碼2.4 redis的存儲格式怎么樣的?2.5 為什么采用Hash結構存儲用戶信息2.6 為什么采用雙攔截器&#xff…

MTK APEX測光系統中各變量具體的計算方式探究

目錄 一、APEX測光系統介紹 二、MTK測光系統實例介紹 三、關于測光系統的一些疑問 一、APEX測光系統介紹 詳細內容可以參考; AE(自動曝光)系統簡介

K8S的基本概念

Kubernetes是一個開源的容器編排部署管理平臺,用于管理云平臺中多個主機上的容器化應用。Kubernetes的目標是讓部署容器化的應用簡單并且高效,Kubernetes提供了應用部署、規劃、更新、維護的一種機制。 對應用開發者而言,可以把Kubernetes看成一個集群操作系統。Kubernetes…

NLP學習路線圖(三十四): 命名實體識別(NER)

一、命名實體識別(NER)是什么? 命名實體識別(Named Entity Recognition, NER)是自然語言處理中的一項關鍵序列標注任務。其核心目標是從非結構化的文本中自動識別出特定類別的名詞性短語,并將其歸類到預定義的類別中。 核心目標:找到文本中提到的命名實體,并分類。 典…

大三自學筆記:探索Hyperlane框架的心路歷程

## Day 1:初識 Hyperlane 在 GitHub 上發現了 Hyperlane 這個 Rust HTTP 框架,立刻被它的性能數據吸引。官方文檔寫著: > "hyperlane 是一個高性能且輕量級的 Rust HTTP 框架,設計目標是簡化現代 Web 服務的開發&#xff…

Java大廠面試真題:謝飛機的技術挑戰

Java大廠面試真題:謝飛機的技術挑戰 場景一:電商場景 面試官:在電商項目中,我們通常需要處理大量的并發請求。請談談你對JVM調優的理解。 謝飛機:嗯,JVM調優主要是為了提高程序的性能和穩定性。比如&…

【Docker管理工具】安裝容器管理工具Oxker

【Docker管理工具】安裝Oxker容器管理工具 一、Oxker介紹1.1 Oxker簡介1.2 Oxker功能1.3 Docker介紹 二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹 三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3 檢查docker compose 版本 四、下載Oxker鏡像五、安裝Oxke…

產品成本分析怎么做?從0到1搭建全生命周期分析框架!

目錄 一、為什么要做產品全生命周期成本分析? 1.資源再分配 2.動態成本校準 3.戰略決策支持 二、產品成本分析思路 1.建立全生命周期成本追蹤 2.聯動分析關鍵指標 3.定位問題產品線 4.資源效率四象限分配 三、產品成本分析指標 1.分投入成本:…

機器學習與深度學習20-數學優化

目錄 前文回顧1.梯度下降的基本原理2.什么是損失函數?3.隨機梯度下降和小批量梯度下降4.什么是學習率5.優化算法中的收斂性6.常用的數學優化算法 前文回顧 上一篇文章鏈接:地址 1.梯度下降的基本原理 梯度下降(Gradient Descent&#xff0…

Photoshop 2025 性能配置全攻略:硬件選購與軟件優化指南

一、硬件配置核心建議 根據Adobe官方要求及實測反饋,Photoshop 2025對硬件的需求側重CPU、內存和存儲,顯卡需求相對寬松,但特定功能(如AI濾鏡、3D渲染)需關注顯卡性能。 硬件類別最低配置推薦配置(流暢運…

華為云Flexus+DeepSeek征文 | 華為云ModelArts Studio快速上手:DeepSeek-R1-0528商用服務的開通與使用

華為云FlexusDeepSeek征文 | 華為云ModelArts Studio快速上手:DeepSeek-R1-0528商用服務的開通與使用 引言一、ModelArts Studio平臺介紹華為云ModelArts Studio簡介ModelArts Studio主要特點 二、開通DeepSeek-R1-0528商用服務訪問ModelArts Studio控制臺DeepSeek-…

day53 神經網絡調參指南

目錄 一、引言 二、權重初始化:為何如此重要? (一)隨機種子:確保實驗的可重復性 (二)權重初始化的重要性 1. 神經網絡的對稱性問題 2. 避免梯度消失和梯度爆炸 (三&#xff0…

【大模型02---Megatron-LM】

文章目錄 Megatron-LM數據并行模型并行張量并行流水線并行 3D并行 Megatron-LM Megatron是當前大模型訓練時經常使用的一種分布式并行框架,它通過采用DP,TP,PP等來加速模型的訓練,反正就是一個字,好。 大模型在訓練的時候,顯存占…

魔百和網絡機頂盒CM211-1硬件解析

先來個正面照 背面照 核芯 無線網卡 支持WiFi與藍牙 硬盤 正面內存與背面內存

Kratos 與Golang Cms的關系

Kratos 與 Golang CMS 的關系 Kratos 是 Bilibili 開源的一款輕量級 Go 語言微服務框架,專注于構建高性能、可擴展的后端服務。雖然它本身并不是一個完整的 CMS(內容管理系統),但它可以用于開發 CMS 系統的后端或 API 服務。 我們的目標是提供全面的微服務開發技術。基于…

在vue3+vite中給 Video視頻 添加字幕

Video視頻 添加字幕 方式一: 使用 track標簽template標簽中css樣式修改方式二:直接讀取.vtt文件方式一: 使用 track標簽 參考1:https://blog.csdn.net/weixin_42321819/article/details/112442773 參考2:https://blog.csdn.net/foren_whb/article/details/80810552 template標…