setupData里面会对是否复用或者重新创建DcAsyncChannel进行判断.

1.checkForCompatibleConnectedApnContext()会判读是否有可以复用的DcAsyncChannel.在mApnContexts 里面一个一个的找是否有对应ApnContext的DcAsyncChannel是否非空且能处理请求的apn type类型且如果ApnContext对应的状态是否CONNECTED,RETRYING或者CONNECTING就返回对应的DcAsyncChannel如果是其他状态就返回null

2.isOnlySingleDcAllowed()方法判断当前的radio Tech是否支持单PDN或者MPDN

<integer-array name="config_onlySingleDcAllowed">

<item>1</item> <!-- GPRS -->

<item>2</item> <!-- EDGE -->

<item>3</item> <!-- UMTS -->

<item>4</item> <!-- IS95A -->

<item>5</item> <!-- IS95B -->

<item>6</item> <!-- 1xRTT -->

<item>7</item> <!-- EVDO_0 -->

<item>8</item> <!-- EVDO_A -->

<item>9</item> <!-- HSDPA -->

<item>10</item> <!-- HSUPA -->

<item>11</item> <!-- HSPA -->

<item>12</item> <!-- EVDO_B -->

<item>13</item> <!-- EHRPD -->

<item>14</item> <!-- LTE -->

<item>15</item> <!-- HSPAP -->

private boolean isOnlySingleDcAllowed(int rilRadioTech) {

    int[] singleDcRats = mPhone.getContext().getResources().getIntArray(

            com.android.internal.R.array.config_onlySingleDcAllowed);

    boolean onlySingleDcAllowed = false;

    if (Build.IS_DEBUGGABLE &&

            SystemProperties.getBoolean("persist.telephony.test.singleDc", false)) {

        onlySingleDcAllowed = true;

    }

    if (singleDcRats != null) {

        for (int i=0; i &lt; singleDcRats.length && onlySingleDcAllowed == false; i++) {

            if (rilRadioTech == singleDcRats[i]) onlySingleDcAllowed = true;

        }

    }

    if (DBG) log("isOnlySingleDcAllowed(" + rilRadioTech + "): " + onlySingleDcAllowed);

    return onlySingleDcAllowed;

}

如果只支持单PDN那么就要根据当前申请的apn的优先级进行处理,如果当前申请的apn是高优先级那么就要把底优先级的apn给close掉在建立数据业务。如果申请的apn是底优先级的,那么就放弃建立数据业务.

3.findFreeDataConnection()在mDataConnectionAcHashMap里面看能否找一个DcAsyncChannel是inactive state 的.就复用这个DcAsyncChannel.

4.createDataConnection()创建DataConnection对象.

DataConnection conn = DataConnection.makeDataConnection(mPhone, id, this, mDcTesterFailBringUpAll, mDcc);

并创建DcAsyncChannel对象,并把dcac放入mDataConnectionAcHashMap里面在后面的查找复用的时候用.

DcAsyncChannel dcac = new DcAsyncChannel(conn, LOG_TAG);

int status = dcac.fullyConnectSync(mPhone.getContext(), this, conn.getHandler());

if (status == AsyncChannel.STATUS_SUCCESSFUL) {

mDataConnectionAcHashMap.put(dcac.getDataConnectionIdSync(), dcac);

} else {

loge("createDataConnection: Could not connect to dcac=" + dcac + " status=" + status);

}

5.通过DcAsyncChannel.bringUp()向DataConnection对象发送建立数据业务的消息.

results matching ""

    No results matching ""