前面在DcTracker初始化過程中注冊(cè)了大量監(jiān)聽器垂睬,其中有兩個(gè)監(jiān)聽器可以觸發(fā)APN的創(chuàng)建過程:1、SIM載入完畢抗悍;2驹饺、APN改變。其中SIM載入完畢的注冊(cè)是EVENT_RECORDS_LOADED事件缴渊,APN改變是注冊(cè)了一個(gè)ApnChangeObserver類來監(jiān)聽逻淌。
當(dāng)SIM載入完畢時(shí),將會(huì)觸發(fā)onRecordsLoaded()
private void onRecordsLoaded() {
logi("onRecordsLoaded: createAllApnList");
mAutoAttachOnCreationConfig = mPhone.getContext().getResources()
.getBoolean(com.android.internal.R.bool.config_auto_attach_data_on_creation);
createAllApnList();
setInitialAttachApn();
if (mPhone.mCi.getRadioState().isOn()) {
if (DBG) log("onRecordsLoaded: notifying data availability");
notifyOffApnsOfAvailability(Phone.REASON_SIM_LOADED);
}
setupDataOnConnectableApns(Phone.REASON_SIM_LOADED);
}
當(dāng)APN改變時(shí)疟暖,用戶指定APN,將會(huì)觸發(fā)onApnChanged()
/**
* Handles changes to the APN database.
*/
private void onApnChanged() {
DctConstants.State overallState = getOverallState();
boolean isDisconnected = (overallState == DctConstants.State.IDLE ||
overallState == DctConstants.State.FAILED);
createAllApnList();
setInitialAttachApn();
cleanUpConnectionsOnUpdatedApns(!isDisconnected);
// FIXME: See bug 17426028 maybe no conditional is needed.
if (mPhone.getSubId() == SubscriptionManager.getDefaultDataSubId()) {
setupDataOnConnectableApns(Phone.REASON_APN_CHANGED);
}
}
兩個(gè)事件都會(huì)調(diào)用createAllApnList()和setInitialAttachApn()田柔,分別是初始化當(dāng)前卡可用的所有APN和設(shè)置默認(rèn)聯(lián)網(wǎng)用的APN俐巴,首先看createAllApnList()
private void createAllApnList() {
mAllApnSettings = new ArrayList<ApnSetting>();
IccRecords r = mIccRecords.get();
String operator = (r != null) ? r.getOperatorNumeric() : "";
if (operator != null) {
String selection = "numeric = '" + operator + "'";
Cursor cursor = mPhone.getContext().getContentResolver().query(
Telephony.Carriers.CONTENT_URI, null, selection, null, null);
if (cursor != null) {
if (cursor.getCount() > 0) {
mAllApnSettings = createApnList(cursor);
}
cursor.close();
}
}
addEmergencyApnSetting(); // 添加emergencyApnSettings
dedupeApnSettings(); // 去除重復(fù)的APN
if (mAllApnSettings.isEmpty()) {
mPreferredApn = null;
} else {
mPreferredApn = getPreferredApn();
if (mPreferredApn != null && !mPreferredApn.numeric.equals(operator)) {
mPreferredApn = null;
setPreferredApn(-1);
}
}
setDataProfilesAsNeeded();
}
這里面主要做了三件事
1、創(chuàng)建一個(gè)APN的列表硬爆,其中包含:當(dāng)前SIM對(duì)應(yīng)的APN欣舵、緊急APN;
APN的來源是telephony.db數(shù)據(jù)庫中表carries,數(shù)據(jù)庫的的參數(shù)是更新于apns-conf.xml文件
2缀磕、合并相同的APN缘圈;
在apns-conf.xml中的APN有可能又重復(fù)的
3、尋找一個(gè)當(dāng)前Prefer的APN參數(shù)袜蚕;
用戶使用一張卡時(shí)糟把,可能手動(dòng)選擇過使用的APN,因此牲剃,當(dāng)用戶再次插拔卡后遣疯,getPreferredApn用于找出用戶之前選擇的APN
這個(gè)mPreferredApn會(huì)在buildWaitingApns中被檢查
如果mPreferredApn滿足用戶數(shù)據(jù)鏈接的需求,那么buildWaitingApns就直接會(huì)返回mPreferredApn用于聯(lián)網(wǎng)使用的APN
如果mPreferredApn已經(jīng)不能滿足用戶數(shù)據(jù)鏈接的需求時(shí)凿傅,才會(huì)從mAllApnSettings(createAllApnList)中去找合適的APN用于聯(lián)網(wǎng)
這就是為什么setupData中g(shù)etNextWaitingApn要去拿list的第0個(gè)APN聯(lián)網(wǎng)缠犀,因?yàn)楫?dāng)mPreferredApn有效時(shí),只會(huì)有一個(gè)APN存在apnContext中
以上就是APN的初始化和設(shè)置默認(rèn)值