【Android 数据业务解析】nwTypeChanged引发的原因

本文主要分析由于nwTypeChanged引发的数据连接流程。

在DcTracker的handleMessage方法中,会由于 nwTypeChanged原因来使得手机去尝试建立数据连接,调用setupDataOnConnectableApns方法。
// 当DcTracker接收到EVENT_DATA_RAT_CHANGED的消息时,会尝试建立数据连接,建立连接的原因是nwTypeChanged
case DctConstants.EVENT_DATA_RAT_CHANGED:
//May new Network allow setupData, so try it here
setupDataOnConnectableApns(Phone.REASON_NW_TYPE_CHANGED,
                           RetryFailures.ONLY_ON_CHANGE);
break;


DctConstants.EVENT_DATA_RAT_CHANGED消息的注册是在DcTracker的registerForAllEvents方法中,向ServiceStateTracker对象注册了消息。

//监听接入技术状态,执行setupDataOnConnectableApns方法
mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(this, DctConstants.EVENT_DATA_RAT_CHANGED, null);

在ServiceStateTracker中可以进行注册该消息,或者注销掉该消息。

public void registerForDataRegStateOrRatChanged(Handler h, int what, Object obj) {
    Registrant r = new Registrant(h, what, obj);
    mDataRegStateOrRatChangedRegistrants.add(r);
    notifyDataRegStateRilRadioTechnologyChanged();
}
public void unregisterForDataRegStateOrRatChanged(Handler h) {
    mDataRegStateOrRatChangedRegistrants.remove(h);
}

那么, DctConstants.EVENT_DATA_RAT_CHANGED的消息会由 mDataRegStateOrRatChangedRegistrants来进行通知。
在ServiceStateTracker的notifyDataRegStateRilRadioTechnologyChanged方法中,进行了消息的通知:
protected void notifyDataRegStateRilRadioTechnologyChanged() {
    int rat = mSS.getRilDataRadioTechnology();
    int drs = mSS.getDataRegState();
    if (DBG) log("notifyDataRegStateRilRadioTechnologyChanged: drs=" + drs + " rat=" + rat);
    mPhoneBase.setSystemProperty(TelephonyProperties.PROPERTY_DATA_NETWORK_TYPE,
            ServiceState.rilRadioTechnologyToString(rat));
    mDataRegStateOrRatChangedRegistrants.notifyResult(new Pair<Integer, Integer>(drs, rat));
}

而notifyDataRegStateRilRadioTechnologyChanged的调用是在Gsm ServiceStateTracker的 pollStateDone方法中。在 hasDataRegStateChanged为真,或者hasRilDataRadioTechnologyChanged为真的情况下,会触发通知。

if (hasDataRegStateChanged || hasRilDataRadioTechnologyChanged) {
    notifyDataRegStateRilRadioTechnologyChanged();

    if (ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN
            == mSS.getRilDataRadioTechnology()) {
        mPhone.notifyDataConnection(Phone.REASON_IWLAN_AVAILABLE);
    } else {
        mPhone.notifyDataConnection(null);
    }
}

上述两个布尔值的取值如下:

boolean hasDataRegStateChanged =
        mSS.getDataRegState() != mNewSS.getDataRegState();

boolean hasRilDataRadioTechnologyChanged =
        mSS.getRilDataRadioTechnology() != mNewSS.getRilDataRadioTechnology();


结论:即当网络返回的状态中发生了数据注册状态变化或者无线通信技术类型的变化时,DcTracker就会发起由nwTypeChanged引发的数据连接。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值