android 系统数据业务---关闭

来源:互联网 发布:php怎样保持登录状态 编辑:程序博客网 时间:2024/05/16 16:18

3 数据业务关闭

数据业务关闭从DcTracker的onCleanUpAllConnections方法开始论述,调用流程图如下,


cleanUpConnection的逻辑如下,

调用DcAsyncChannel的tearDown方法获取配置的信息,然后发送发送EVENT_DISCONNECT消息,断开网络

Message msg = obtainMessage(DctConstants.EVENT_DISCONNECT_DONE, apnContext);if (disconnectAll) {    apnContext.getDcAc().tearDownAll(apnContext.getReason(), msg);} else {    apnContext.getDcAc().tearDown(apnContext, apnContext.getReason(), msg);}

DcAsyncChannel的tearDown方法如下,

sendMessage(DataConnection.EVENT_DISCONNECT,                        new DisconnectParams(apnContext, reason, onCompletedMsg));

直接发送EVENT_DISCONNECT方法,

如果当前的状态是DcActiveState, DcActiveState的processMessage方法对EVENT_DISCONNECT消息处理如下,

首先调用tearDownData方法向RIL发送请求,

tearDownData(dp);

然后将状态切换为DcDisconnectingState,

transitionTo(mDisconnectingState);

最后在DataConnection离开DcActiveState时,将调用其中的exit函数,

mNetworkAgent.sendNetworkInfo(mNetworkInfo);

更新NetworkAgent的状态,将通知ConnectivityService移除网络。和进入该状态时相对应。

3.1 tearDownData

tearDownData方法的主要逻辑如下,

mPhone.mCi.deactivateDataCall(mCid, discReason,      obtainMessage(EVENT_DEACTIVATE_DONE, mTag, 0, o));

调用RIL的deactivateDataCall方法向modem发送RIL_REQUEST_DEACTIVATE_DATA_CALL消息,断开网络,

modem处理完该消息后,回调DataConnection状态机处理EVENT_DEACTIVATE_DONE消息。

3.2 状态转换

DcDisconnectingState状态对EVENT_DEACTIVATE_DONE消息处理如下,

AsyncResult ar = (AsyncResult) msg.obj;//获取处理结果DisconnectParams dp = (DisconnectParams) ar.userObj;if (dp.mTag == mTag) {    •••    mInactiveState.setEnterNotificationParams((DisconnectParams) ar.userObj);    transitionTo(mInactiveState);//将状态切换到DcInactiveState状态。}

DcInactiveState的enter方法如下,

notifyDisconnectCompleted(mDisconnectParams, true);

主要是通知连接已断开,详细的过程就不再论述了。和通知连接的状态一样。

3.3 NetworkAgent更新

NetworkAgent的sendNetworkInfo方法如下,

queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, new NetworkInfo(networkInfo));

queueOrSendMessage方法如下,

private void queueOrSendMessage(int what, Object obj) {  synchronized (mPreConnectedQueue) {      if (mAsyncChannel != null) {           mAsyncChannel.sendMessage(what, obj);      } •••}

通过AsyncChannel发送EVENT_NETWORK_INFO_CHANGED消息,

ConnectivityService中对该消息处理如下,

NetworkAgentInfo nai = mNetworkAgentInfos.get(msg.replyTo);     if (nai == null) {        loge("EVENT_NETWORK_INFO_CHANGED from unknown NetworkAgent");                        break;   }  info = (NetworkInfo) msg.obj;  updateNetworkInfo(nai, info);

updateNetworkInfo方法中对断开的处理代码如下,

else if (state == NetworkInfo.State.DISCONNECTED ||                state == NetworkInfo.State.SUSPENDED) {    networkAgent.asyncChannel.disconnect();//asyncChannel 断开    if (networkAgent.isVPN()) { //VPN断开        synchronized (mProxyLock) {        if (mDefaultProxyDisabled) {             mDefaultProxyDisabled = false;             if (mGlobalProxy == null && mDefaultProxy != null) {                  sendProxyBroadcast(mDefaultProxy);             }          }       }    }}

asyncChannel断开时会发送CMD_CHANNEL_DISCONNECTED消息,

ConnectivityService中的NetworkStateTrackerHandler收到消息后,将调用handleAsyncChannelDisconnected进行处理,

try {    mNetd.removeNetwork(nai.network.netId);}

调用NetworkManagementService的removeNetwork删除网络等信息,当然最后还是调用netd进行完成。

 

小结:

数据业务的关闭流程比打开要容易很多,主要步骤如下,

1,调用RIL 发送RIL_REQUEST_DEACTIVATE_DATA_CALL消息到modem关闭。

2,状态从DcActiveState切换为DcDisconnectingState,最后到DcInactiveState。

3, 通过NetworkManagementService和netd守护进程进行交互, 删除网络等信息。