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守护进程进行交互, 删除网络等信息。
- android 系统数据业务---关闭
- android 系统数据业务---打开/关闭概述
- android 系统数据业务---打开
- android 系统数据业务---模式
- android 系统数据业务---模式
- android 系统数据业务---打开(下)
- android 系统数据业务---phone进程启动
- android 系统数据业务---模式切换分析(上)
- android 系统数据业务---模式切换分析(下)
- android系统数据业务知识点总结(一)
- android系统数据业务知识点总结(二)
- android Data call disable(移动网络--关闭数据业务部分)
- 数据业务支撑系统
- Android数据业务发起流程
- Android N数据业务总结
- Android数据业务发起流程
- Android中构建数据业务应用
- Android中构建数据业务应用
- 执行计划-CONCATENATION释疑
- 一起学ROS之启动文件及ROS命令汇总
- Linux虚拟机安装Redis
- js
- 百练_2675:计算书费
- android 系统数据业务---关闭
- 二叉搜索树
- AI十大高危行业
- Android greenDao 初识运用
- QT PC Tool
- x264源代码简单分析:宏块分析(Analysis)部分-帧内宏块(Intra)
- AI发展受影响的高危岗位
- python + webdriver
- 器——Eclipse开发JAVA中如何Debug