apn设置
2.2 setInitialattachApn
setInitialAttachApn方法调用流程图如下,
DcTrackerBase的setInitialAttachApn方法如下,
setInitialAttachApn(mAllApnsettings, mPreferredApn);
一般第一次开机时, mPreferredApn为null。
mAllApnSettings为当前SIM卡的对应的APN。
setInitialAttachApn方法主要逻辑如下,
1,为三个APN变量赋值,
ApnSetting iaApnSetting = null; //可用APN中类型包含APN_TYPE_IA(ia)的APN
ApnSetting defaultApnSetting = null; //可用APN中包含default类型的APN
ApnSetting firstApnSetting = null; //可用APN的第一个APN
•••
firstApnSetting = apnList.get(0);
for (ApnSetting apn : apnList) {
// Can't use apn.canhandleType(), as that returns true for APNs that have no type.
if (ArrayUtils.contains(apn.types, Phoneconstants.APN_TYPE_IA) &&
apn.carrierEnabled) {
// The Initial Attach APN is highest priority so use it if there is one
log("setInitialApn: iaApnSetting=" + apn);
iaApnSetting = apn; //为iaApnSetting 变量赋值
break;
} else if ((defaultApnSetting == null)
&& (apn.canHandleType(PhoneConstants.APN_TYPE_DEFAULT))) {
// Use the first default apn if no better choice
log("setInitialApn: defaultApnSetting=" + apn);
defaultApnSetting = apn; //为defaultApnSetting变量赋值
}
}
2,从4个ApnSetting 对象中选择一个进行发起拨号上网请求,优先级依次为iaApnSetting, preferredApn, defaultApnSetting, firstApnSetting,
ApnSetting initialAttachApnSetting = null;
if (iaApnSetting != null) {
if (DBG) log("setInitialAttachApn: using iaApnSetting");
initialAttachApnSetting = iaApnSetting;
} else if (preferredApn != null) {
if (DBG) log("setInitialAttachApn: using preferredApn");
initialAttachApnSetting = preferredApn;
•••
3,如果这4个值都为空,就不发起拨号请求;否则调用RIL的setInitialAttachApn方法发起拨号请求,
if (initialAttachApnSetting == null) {
if (DBG) log("setInitialAttachApn: X There in no available apn");
} else {
if (DBG) log("setInitialAttachApn: X selected Apn=" + initialAttachApnSetting);
mPhone.mCi.setInitialAttachApn(initialAttachApnSetting.apn,
initialAttachApnSetting.protocol, initialAttachApnSetting.authType,
initialAttachApnSetting.user, initialAttachApnSetting.password, null);
}
例如,以下是一份开机拨号上网的log,
在这份log中, defaultApnSetting, firstApnSetting的ApnSetting对象完全相同,因此还是选择的defaultApnSetting对象的信息进行attach请求。
RIL的setInitialAttachApn方法如下,
RILrequest rr = RILRequest.obtain(RIL_REQUEST_SET_INITIAL_ATTACH_APN, result);
•••
rr.mParcel.writeString(apn);
rr.mParcel.writeString(protocol);
rr.mParcel.writeInt(authType);
rr.mParcel.writeString(username);
rr.mParcel.writeString(password);
•••
send(rr);
通过socket给rild守护进程发送RIL_REQUEST_SET_INITIAL_ATTACH_APN消息。
到此,虽然还暂时没有设置mPreferredApn,但是已经向rild守护进程发送attach请求了。
2.3 setupDataOnConnectableApns
当SIM卡加载完成,并完成上面2个步骤之后,就会调用DcTracker 的setupDataOnConnectableApns方法。
setupDataOnConnectableApns方法调用流程图如下,
setupDataOnConnectableApns逻辑如下,
1,逐个循环调用mPrioritySortedApncontexts变量中的ApnContext对象,调用buildWaitingApns方法获取对应的ApnSetting对象,
for (ApnContext apnContext : mPrioritySortedApnContexts) {
ArrayList<ApnSetting> waitingApns = null;
••••
waitingApns = buildWaitingApns(apnContext.getApnType(), radioTech);
2,如果该APN已激活,则调用trySetupData方法发起拨号
if (apnContext.isConnectable()) {
log("setupDataOnConnectableApns: isConnectable() call trySetupData");
apnContext.setReason(reason);
trySetupData(apnContext, waitingApns);
}
setupData最后的逻辑如下,
message msg = obtainMessage();
msg.what = DctConstants.EVENT_DATA_SETUP_COMPLETE;
msg.obj = new Pair<ApnContext, integer>(apnContext, generation);
dcac.bringUp(apnContext, getInitialMaxretry(), profileId, radioTech,
mAutoAttachOnCreation.get(), msg, generation);
封装EVENT_DATA_SETUP_COMPLETE 消息,然后调用DcAsyncChannel的bringUp方法发起拨号过程。
如果完成拨号过程,就会回调DcTracker的父类DcTrackerBase的handleMessage方法
处理EVENT_DATA_SETUP_COMPLETE 消息,对该消息处理如下,
case DctConstants.EVENT_DATA_SETUP_COMPLETE:
ondatasetupComplete((AsyncResult) msg.obj);
break;
调用DcTracker的onDataSetupComplete方法,该方法会将调用setPreferredApn方法将当前已拨号上网的APN写入telephony.db数据库的siminfo表中。
因此,经过这一步骤,终于将siminfo表填写完整了。
详细的拨号上网过程在数据业务那一章节论述,至于 ApnContext是什么,怎么和ApnSetting对象映射的,后面再论述。
相关阅读
如何建立,又如何获利资金推动上涨的面粉是一个数字,教你如何操纵公众微信号码,开始了微信公共基础操作微信公众的含量一步一步,微通道
在使用Excel表格对数据进行排序的时候,网友可能会不希望将表格的第一行或第一列同样计入排序的数据中,想要这样我们就需要在排序时
转自:http://benyouhui.it168.com/thread-1874010-1-1.html 本帖最后由 redalert01 于 2011-11-27 23:06 编辑BIOS是英文Basic Inp
sqlserver中set IDENTITY_INSERT on 和 off 的设置方
前言 最近频繁用数据库,发现数据库并没有想想的那么好操作,今天遇到了一个插入的问题,表格建好了,往里边插入数据的时候就报错。说se
为了能够展现表现出店铺的身份,卖家们也都会选择一些一张图片来作为自己的店铺头像,这样一来的话,我们的买家在看到店铺的头像的时候