本文主要分析由于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引发的数据连接。