• ics Call应用


    1.Call:Call有九种状态:IDLE,ACTIVE,HOLDING,DIALING,ALERTING,INCOMING,WAITING,DISCONNECTED,DISCONNECTING;


    2.Connection:
    a.CdmaConnection (Context context, DriverCall dc, CdmaCallTracker ct, int index)
    这个构造方法是在MT的时候使用的。因为它有一个DriverCall的参数。它通过parentFromDCState方法来获得对应的parent(call),把connection加入到call的connections变量进行管理。

    b.CdmaConnection(Context context, String dialString, CdmaCallTracker ct, CdmaCall parent) 这个构造方法是在MO的时候使用的,它会传入一个指定的parent(call)且通过parentattachFake(),调用把Connection加入到call的connections变量进行管理。


    3.DriverCall

    是与ril层通信时的一个中间处理类,主要用来接收ril的call数据后转到java层上来。


    4.CallTracker
    a.首先着重理解ringingCall,foregroundCall,backgroundCall的含义。
    在CdmaConnection.java中可以看到
        private CdmaCall
        parentFromDCState (DriverCall.State state) {
            switch (state) {
                case ACTIVE:
                case DIALING:
                case ALERTING:
                    return owner.foregroundCall;
                //break;


                case HOLDING:
                    return owner.backgroundCall;
                //break;


                case INCOMING:
                case WAITING:
                    return owner.ringingCall;
                //break;


                default:
                    throw new RuntimeException("illegal call state: " + state);
            }
        }
    ringingCall:用来管理INCOMING和WAITING的通话
    foregroundCall:用来管理DAILING、ALERTING、ACTIVE的通话
    backgroundCall:用来管理HOLD的通话


    b.CdmaCallTracker的事件处理机制
    CdmaCallTracker.java,以dial为例,过程如下:
    RIL_REQUEST_DIAL:pendingOperations++,needsPoll=true
    EVENT_OPERATION_COMPLETE:pendingOperations--
    RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED:如果call state有变化
    RIL_REQUEST_GET_CURRENT_CALLS:
    EVENT_POLL_CALLS_RESULT:if(msg == lastRelevantPoll)...
    事件涉及到三个变量。
    pendingOperations:这个变量时在发生请求的时候会++,在处理应答的时候会--。
    needsPoll:该变量是用来配合pendingOperations处理是否需要从RIL获取当前calls列表,并更新connections列表。
    lastRelevantPoll:在发送RIL_REQUEST_GET_CURRENT_CALLS的时候记录最近一次请求的message,在response的时候只对最近一次请求的response做出相应,更新connections列表。
    上面三个变量主要是用来判断是否需要发送RIL_REQUEST_GET_CURRENT_CALLS请求来获得当前calls列表,并更新connections列表。
    handlePollCalls()函数中。
    if (conn == null && dc != null){
    //conn为null,说明CallTracker中是没有对应的call的。这只有两种情况可以发生。MO的dialing///状态和MT的incoming/waiting状态。打电话和来电的时候会执行到此处。
    }else if(conn != null && dc == null){
    //说明在底层已经挂掉了。callTracker需要drop该connection,对方挂断电话的时候会执行到此处
    }else if(conn != null && dc != null){
    //
    }
    if (newRinging != null) {
    //表示是一个MT call,需要通知用户。
                phone.notifyNewRingingConnection(newRinging);
    }
  • 相关阅读:
    蓝牙的HFP协议笔记
    23种设计模式
    读QT5.7源码(三)Q_OBJECT 和QMetaObject
    实现私有化(Pimpl) --- QT常见的设计模式
    蓝牙Profile的概念和常见种类(转)
    git分支合并
    git log的常见用法
    QThread详解
    git查看某个文件的修改历史
    因为代理原因导致的NotSerializableException
  • 原文地址:https://www.cnblogs.com/chengliu/p/3636420.html
Copyright © 2020-2023  润新知