在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中进行管理,然后调用了DcTracker的setEnabled

本文深入探讨了PhoneApp初始化过程中,TelephonyNetworkFactory如何调用DcTracker的requestNetwork方法,接着分析了ApnContext请求网络的过程,以及DcTracker的setEnabled和trySetupData方法的逻辑。在当前流程中,数据连接并未成功建立,文章预告将分析数据连接的实际建立流程。
最低0.47元/天 解锁文章
3309

被折叠的 条评论
为什么被折叠?



