• 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);
    }
  • 相关阅读:
    操作系统基本原理
    String.StartsWith 方法
    桥接模式
    there is no default constructor available in ... | interface extends interface
    JAVA,获取手机屏幕大小
    JAVA,读写properties文件
    JAVA,执行cmd命令控制台输出内容乱码问题解决
    JAVA自动化,使用UIAutomator2加快Appium运行速度
    JAVA自动化,真机打开APP,弹出权限弹窗问题解决
    揭秘TDSQL-A分布式执行框架:解放OLAP关联分析查询性能瓶颈
  • 原文地址:https://www.cnblogs.com/chengliu/p/3636420.html
Copyright © 2020-2023  润新知