经过前面
这些过程,网络连接所需要的条件就全部准备就绪,接下来就是等待网络接入。
我们把网络接入过程简单分为三个阶段:
触发阶段
----该阶段是由各种不同事件触发的,比如 SIM载入完毕、 PS域Attach成功、 通话结束、 APN改变等,该阶段的最终都是要调用setupDataOnConnectableApns()方法;
准备连接阶段
----该阶段是指,在DcTracker收到建立连接的请求之后,需要进行一系列有效性检测,比如 APN是否已经激活、 PS是否已经就绪、 用户是否打开网络开关等,然后创建DataConnection()对象,准备发起连接请求;
发送连接命令阶段
什么是 Data Attach事件呢?其实就是手机的 PS域Attach成功,而PS域是和CS域相对应,简单来说,手机(2G/3G)打电话是在CS域上进行,而数据流量是在PS域上进行,PS域附着(Attach)成功之后才可以发起数据激活的信令,然后才可以上网,默认状态下,手机开机后就会发起PS附着的信令给网络,附着成功之后将会接到成功的消息,由于DcTracker当初初始化时在registerForAllEvents()中注册了Attach的监听器:
我们把网络接入过程简单分为三个阶段:
触发阶段
----该阶段是由各种不同事件触发的,比如 SIM载入完毕、 PS域Attach成功、 通话结束、 APN改变等,该阶段的最终都是要调用setupDataOnConnectableApns()方法;
准备连接阶段
----该阶段是指,在DcTracker收到建立连接的请求之后,需要进行一系列有效性检测,比如 APN是否已经激活、 PS是否已经就绪、 用户是否打开网络开关等,然后创建DataConnection()对象,准备发起连接请求;
发送连接命令阶段
----该阶段是指,在DataConnection收到DcTracker的请求之后,将请求转交给RILJ的过程,经过该阶段后,请求就发送到了RIL以及Modem层,由底层完成信令的发送和接收;
一、触发阶段
//漫游相关
static final String REASON_ROAMING_ON = "roamingOn";
static final String REASON_ROAMING_OFF = "roamingOff";
//PS attach
static final String REASON_DATA_ATTACHED = "dataAttached";
//APN改变
static final String REASON_APN_CHANGED = "apnChanged";
//通话结束
static final String REASON_VOICE_CALL_ENDED = "2GVoiceCallEnded";
//SIM载入完毕
static final String REASON_SIM_LOADED = "simLoaded";
//网络模式改变
static final String REASON_NW_TYPE_CHANGED = "nwTypeChanged";
我们挑选最常见的REASON_DATA_ATTACHED原因来分析网络连接的发起过程。
什么是 Data Attach事件呢?其实就是手机的 PS域Attach成功,而PS域是和CS域相对应,简单来说,手机(2G/3G)打电话是在CS域上进行,而数据流量是在PS域上进行,PS域附着(Attach)成功之后才可以发起数据激活的信令,然后才可以上网,默认状态下,手机开机后就会发起PS附着的信令给网络,附着成功之后将会接到成功的消息,由于DcTracker当初初始化时在registerForAllEvents()中注册了Attach的监听器:
protected void registerForAllEvents() {
//监听是否PS域Attach状态
mPhone.getServiceStateTracker().registerForDataConnectionAttached(this, DctConstants.EVENT_DATA_CONNECTION_ATTACHED, null);
}
因此当PS域Attach成功之后,将会收到EVENT_DATA_CONNECTION_ATTACHED消息:
public void handleMessage (Message msg) {
switch (msg.what) {
case DctConstants.EVENT_DATA_CONNECTION_ATTACHED:
onDataConnectionAttached();
break;
}
}
继续:
private void onDataConnectionAttached() {
mAttached.set(true);
if (getOverallState() == DctConstants.State.CONNECTED) {
//已经处于连接状态
startNetStatPoll();
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
notifyDataConnection(Phone.REASON_DATA_ATTACHED);
} else {
//初始化后应该处于IDLE状态
notifyOffApnsOfAvailability(Phone.REASON_DATA_ATTACHED);
}
if (mAutoAttachOnCreationConfig) {
mAutoAttachOnCreation = true;
}
setupDataOnConnectableApns(Phone.REASON_DATA_ATTACHED);
}
当前的连接状态是IDLE,因此会将REASON_DATA_ATTACHED的参数传