在PhoneApp的初始化中,我们分析到,TelephonyNetworkFactory的初始化,最终会调用到DcTracker的requestNetwork方法
private void onNeedNetworkFor(Message msg) {
NetworkRequest networkRequest = (NetworkRequest)msg.obj;
boolean isApplicable = false;
LocalLog localLog = null;
if (TextUtils.isEmpty(networkRequest.networkCapabilities.getNetworkSpecifier())) {
// request only for the default network
localLog = mDefaultRequests.get(networkRequest);
if (localLog == null) {
localLog = new LocalLog(REQUEST_LOG_SIZE);
localLog.log("created for " + networkRequest);
mDefaultRequests.put(networkRequest, localLog);
isApplicable = mIsDefault;
}
} else {
localLog = mSpecificRequests.get(networkRequest);
if (localLog == null) {
localLog = new LocalLog(REQUEST_LOG_SIZE);
mSpecificRequests.put(networkRequest, localLog);
isApplicable = true;
}
}
if (mIsActive && isApplicable) {
String s = "onNeedNetworkFor";
localLog.log(s);
log(s + " " + networkRequest);
mDcTracker.requestNetwork(networkRequest, localLog);
} else {
String s = "not acting - isApp=" + isApplicable + ", isAct=" + mIsActive;
localLog.log(s);
log(s + " " + networkRequest);
}
}
而DcTracker的requestNetwork方法主要有
public void requestNetwork(NetworkRequest networkRequest, LocalLog log) {
final int apnId = ApnContext.apnIdForNetworkRequest(networkRequest);
final ApnContext apnContext = mApnContextsById.get(apnId);
log.log("DcTracker.requestNetwork for " + networkRequest + " found " + apnContext);
if (apnContext != null) apnContext.requestNetwork(networkRequest, log);
}
从前面DcTracker的初始化文章中,我们知道此处apnId为DctConstants.APN_DEFAULT_ID,那么ApnContext所对应的数据为
public ApnContext(Phone phone, String apnType, String logTag, NetworkConfig config,
DcTracker tracker) {
mPhone = phone;
mApnType = apnType;
mState = DctConstants.State.IDLE;
setReason(Phone.REASON_DATA_ENABLED);
mDataEnabled = new AtomicBoolean(false);
mDependencyMet = new AtomicBoolean(config.dependencyMet);
priority = config.priority;
LOG_TAG = logTag;
mDcTracker = tracker;
mRetryManager = new RetryManager(phone, apnType);
}
即apnType为default,priority为0,mDependencyMet为true
接下来,是调用了ApnContext的requestNetwork方法
public void requestNetwork(NetworkRequest networkRequest, LocalLog log) {
synchronized (mRefCountLock) {
if (mLocalLogs.contains(log) || mNetworkRequests.contains(networkRequest)) {
log.log("ApnContext.requestNetwork has duplicate add - " + mNetworkRequests.size());
} else {
mLocalLogs.add(log);
mNetworkRequests.add(networkRequest);
mDcTracker.setEnabled(apnIdForApnName(mApnType), true);
}
}
}
此方法主要是将当前的networkRequest加入到mNetworkRequests中进行管理,然后调用了DcTra