1, InCallActivity 界面信息的顯示
2, NotificationBroadcastReceiver這個類是廣播接收器,一般沒有用到。主要作用是第三方app可以發送廣播的方式進行通話的相關操作,例如,掛斷/接聽等等。接收廣播後,都是調用InCallPresenter的相關方法完成的,部分代碼如下,
InCallPresenter.getInstance().declineIncomingCall(context);
3, InCallServiceImpl這個類在前面論述過,實際上是services telecom進程和dialer進程的一個橋樑,通過binder跨進程調用實現。InCallUI 的架構是一個典型的MVP模式。
InCallPresenter.java直接控制着InCallActivity,與此同時,通過一些監聽器,例如IncomingCallListener/ CanAddCallListener/ InCallDetailsListener等 控制着AnswerPresenter等等。
AnswerPresenter控制着AnswerFragment的顯示,是InCallActivity界面的一部分;
VideoCallPresenter控制着VideoCallFragment的顯示,是InCallActivity界面的一部分;
CallCardPresenter控制着CallCardFragment的顯示,是InCallActivity界面的一部分;
CallButtonPresenter控制着CallButtonFragment的顯示,是InCallActivity界面的一部分;
這些Presenter一般會實現InCallPresenter的監聽器對應的方法。
九種狀態
public static final int PRECISE_CALL_STATE_IDLE = 0; //通話空閒
public static final int PRECISE_CALL_STATE_ACTIVE = 1; //正在通話(活動中)
public static final int PRECISE_CALL_STATE_HOLDING = 2; //通話掛起(例如我和多個人通話,其中一個通話在活動,而其它通話就會進入掛起狀態)
public static final int PRECISE_CALL_STATE_DIALING = 3; //撥號開始
public static final int PRECISE_CALL_STATE_ALERTING = 4; //正在呼出(提醒對方接電話)
public static final int PRECISE_CALL_STATE_INCOMING = 5; //對方來電
public static final int PRECISE_CALL_STATE_WAITING = 6; //第三方來電等待(例如我正在和某人通話,而其他人打入時就會就進入等待狀態)
public static final int PRECISE_CALL_STATE_DISCONNECTED = 7; //掛斷完成
public static final int PRECISE_CALL_STATE_DISCONNECTING = 8; //正在掛斷
CallCardFragment:用於顯示聯繫人信息及通話時間等;
CallButtonFragment:通話界面下方的控制按鈕。
DialpadFragment:撥號盤顯示控件。
AnswerFragment:來電控制控件,用於操作接聽/拒接/短信快捷回覆。
ConferenceManagerFragment:會議電話的界面。
VideoCallFragment:視屏通話控件,在CallCardFragment中調用。
流程圖:
啓動InCallActivity流程,其實很簡單就三個類(不包括framework和system_service)。
數據更新流程圖
InCallActivity數據更新,(不包括framework和system_service)。