dial

GsmCdmaCallTracker
重点关注Message,EVENT_OPERATION_COMPLETE,后续进行回调在handleMessage中进行进一步工作

public synchronized Connection dial(String dialString, int clirMode, UUSInfo uusInfo,
                                     Bundle intentExtras){

         // Always unmute when initiating a new call
         setMute(false);

         mCi.dial(mPendingMO.getAddress(), clirMode, uusInfo, obtainCompleteMessage());
     updatePhoneState();
     mPhone.notifyPreciseCallStateChanged();
     return mPendingMO;
 }

private Message obtainCompleteMessage() {
     return obtainCompleteMessage(EVENT_OPERATION_COMPLETE);
 }

RIL
重点关注Message result,赋值给RILRequest rr.result,后续modem返回响应进行相应处理
log打印:D RILJ : [1616]> DIAL [SUB1]

dial(String address, int clirMode, UUSInfo uusInfo, Message result) {

    RILRequest rr = RILRequest.obtain(RIL_REQUEST_DIAL, result); //构建RILRequest 对象

    rr.mParcel.writeString(address);  //存储数据,Parcel 用于进程间通信
    rr.mParcel.writeInt(clirMode);

    if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));

    send(rr);
}

RIL
重点关注rr.mResult.sendToTarget();回调至GsmCdmaCallTracker.handleMessage进行处理,EVENT_OPERATION_COMPLETE
LOG打印:D RILJ : [1616]< DIAL [SUB1]

processSolicited (Parcel p, int type) {
    if (error == 0) {

        if (RILJ_LOGD) riljLog(rr.serialString() + "< " + requestToString(rr.mRequest)
                + " " + retToString(rr.mRequest, ret));

        if (rr.mResult != null) {
            AsyncResult.forMessage(rr.mResult, ret, null);
            //这就是在GsmCdmaCallTracker调用RILJ的dial方法前创建的Message对象!
            //Message.sendToTarget,这样通过回调,流程就回到调用RILJ的dial方法的地方了。
            rr.mResult.sendToTarget();
        }

    }
    return rr;
}

GsmCdmaCallTracker
重点关注handleMessage的处理,通过Message EVENT_POLL_CALLS_RESULT进行相应的处理

public void handleMessage(Message msg) {

    switch (msg.what) { 
            case EVENT_OPERATION_COMPLETE:
            operationComplete();
        break;
}
private void operationComplete() {
    mPendingOperations--;

    if (mPendingOperations == 0 && mNeedsPoll) {
        //这里又封装了一个Message对象,调用RIL的getCurrentCalls方法主动获取一次call状态,
        //接下来的流程又进入与RIL层的socket通信,过程与前面一样,最后GsmCdmaCallTracker收到
        mLastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT);
        mCi.getCurrentCalls(mLastRelevantPoll);
    } else if (mPendingOperations < 0) {
        // this should never happen
        Rlog.e(LOG_TAG,"GsmCdmaCallTracker.pendingOperations < 0");
        mPendingOperations = 0;
    }
}

RIL
再次RIL GsmCdmaCallTracker进行交互,流程类似
***LOG打印:
D RILJ : [1623]> GET_CURRENT_CALLS [SUB1]
D RILJ : [1623]< GET_CURRENT_CALLS
{[id=1,DIALING,toa=129,norm,mo,0,voc,noevp,,cli=1,,3] } [SUB1]***

getCurrentCalls (Message result) {
    RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_CURRENT_CALLS, result);

    if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));

    send(rr);
}

processSolicited (Parcel p, int type) {
    try {switch (rr.mRequest) {

        case RIL_REQUEST_GET_CURRENT_CALLS: ret =  responseCallList(p); break;

        }

        if (error == 0) {

        if (RILJ_LOGD) riljLog(rr.serialString() + "< " + requestToString(rr.mRequest)
                + " " + retToString(rr.mRequest, ret));

        if (rr.mResult != null) {
            AsyncResult.forMessage(rr.mResult, ret, null);
            //这就是在GsmCdmaCallTracker调用RILJ的dial方法前创建的Message对象!
            //Message.sendToTarget,这样通过回调,流程就回到调用RILJ的dial方法的地方了。
            rr.mResult.sendToTarget();
        }      
    }
    return rr;
}

GsmCdmaCallTracker
重点关注EVENT_POLL_CALLS_RESULT,在operationComplete进行的请求,下一步handlePollCalls
LOG打印: D GsmCdmaCallTracker: Event EVENT_POLL_CALLS_RESULT Received

public void handleMessage(Message msg) {
    AsyncResult ar;

    switch (msg.what) {
        case EVENT_POLL_CALLS_RESULT:
            Rlog.d(LOG_TAG, "Event EVENT_POLL_CALLS_RESULT Received");

            if (msg == mLastRelevantPoll) {//在mCi.getCurrentCalls中进行了初始化mLastRelevantPoll = obtainMessage(EVENT_POLL_CALLS_RESULT);

                mNeedsPoll = false;
                mLastRelevantPoll = null;
                //在RIL.processSolicited中从底层返回的数据构造一个AsyncResult添加进msg.obj
                handlePollCalls((AsyncResult)msg.obj);//msg的obj什么时候进行的初始化,创建msg的时候没有初始化obj,只有what
            }
        break;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值