网络连接评分机制之再谈WIFI与数据切换过程
2017-02-27 17:23
483 查看
前面几节介绍了网络评分机制的运行流程,下面我们再次通过案例来梳理一下评分机制在使用过程中的体现。
用户原本在用数据上网,但是如果到了一个有WIFI的环境,并连接上了WIFI,此时用户的手机将会自动断开数据网络,这是如何做到的呢?
当用户来到WIFI环境时,如果连上了某个WIFI,那么此时的WIFI状态机将会进入L2ConnectedState状态,然后会更新当前NetworkInfo状态为CONNECTING状态,并用该NetworkInfo创建WIFI的NetworkAgent对象,同时标明当前WIFI分值为60。即:
[java]
view plain
copy
print?
mNetworkAgent = new WifiNetworkAgent(getHandler().getLooper(), mContext, "WifiNetworkAgent", mNetworkInfo, mNetworkCapabilitiesFilter, mLinkProperties, 60);
[java]
view plain
copy
print?
NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
new NetworkInfo(networkInfo), new LinkProperties(linkProperties),
new NetworkCapabilities(networkCapabilities), currentScore, mContext, mTrackerHandler,
new NetworkMisc(networkMisc));
然后在rematchNetworkAndRequests中,将发现现有的网络请求所使用的数据流量方案的分值(50分)低于WIFI的分值,将会把最新WIFI的分值通过sendUpdatedScoreToFactories发送到各个NetworkFactory中,其中就包括数据网络:
[java]
view plain
copy
print?
private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) {
for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, 0, networkRequest);
}
}
[java]
view plain
copy
print?
private void evalRequest(NetworkRequestInfo n) {
if (n.requested == false && n.score < mScore &&
n.request.networkCapabilities.satisfiedByNetworkCapabilities(
mCapabilityFilter) && acceptRequest(n.request, n.score)) {
needNetworkFor(n.request, n.score);
n.requested = true;
} else if (n.requested == true &&
(n.score > mScore || n.request.networkCapabilities.satisfiedByNetworkCapabilities(mCapabilityFilter) == false || acceptRequest(n.request, n.score) == false)) {
releaseNetworkFor(n.request);
n.requested = false;
}
}
[java]
view plain
copy
print?
@DcTracker.java
protected void releaseNetworkFor(NetworkRequest networkRequest) {
ApnContext apnContext = apnContextForNetworkRequest(networkRequest);
if (apnContext != null) apnContext.decRefCount();
}
[java]
view plain
copy
print?
@ApnContext.java
public void decRefCount() {
synchronized (mRefCountLock) {
if (mRefCount-- == 1) {
//关闭数据业务
mDcTracker.setEnabled(mDcTracker.apnTypeToId(mApnType), false);
}
}
}
用户原本在用数据上网,但是如果到了一个有WIFI的环境,并连接上了WIFI,此时用户的手机将会自动断开数据网络,这是如何做到的呢?
当用户来到WIFI环境时,如果连上了某个WIFI,那么此时的WIFI状态机将会进入L2ConnectedState状态,然后会更新当前NetworkInfo状态为CONNECTING状态,并用该NetworkInfo创建WIFI的NetworkAgent对象,同时标明当前WIFI分值为60。即:
[java]
view plain
copy
print?
mNetworkAgent = new WifiNetworkAgent(getHandler().getLooper(), mContext, "WifiNetworkAgent", mNetworkInfo, mNetworkCapabilitiesFilter, mLinkProperties, 60);
mNetworkAgent = new WifiNetworkAgent(getHandler().getLooper(), mContext, "WifiNetworkAgent", mNetworkInfo, mNetworkCapabilitiesFilter, mLinkProperties, 60);然后在NetworkAgent初始化过程中将会向ConnectivityService注册,然后ConnectivityService就会创建WIFI的NetworkAgentInfo对象:
[java]
view plain
copy
print?
NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(),
new NetworkInfo(networkInfo), new LinkProperties(linkProperties),
new NetworkCapabilities(networkCapabilities), currentScore, mContext, mTrackerHandler,
new NetworkMisc(networkMisc));
NetworkAgentInfo nai = new NetworkAgentInfo(messenger, new AsyncChannel(), new NetworkInfo(networkInfo), new LinkProperties(linkProperties), new NetworkCapabilities(networkCapabilities), currentScore, mContext, mTrackerHandler, new NetworkMisc(networkMisc));然后ConnectivityService将会在handleRegisterNetworkAgent方法中更新当前WIFI的NetworkAgentInfo为CONNECTED状态,并向NetworkMonitor发送连接成功的消息,然后经过有效性检测,WIFI的分值将会保持在60分。
然后在rematchNetworkAndRequests中,将发现现有的网络请求所使用的数据流量方案的分值(50分)低于WIFI的分值,将会把最新WIFI的分值通过sendUpdatedScoreToFactories发送到各个NetworkFactory中,其中就包括数据网络:
[java]
view plain
copy
print?
private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) {
for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, 0, networkRequest);
}
}
private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) { for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) { nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score, 0, networkRequest); } }此时数据网络会再次进行分值对比,并发现自己的分值的确低于目标WIFI分值:
[java]
view plain
copy
print?
private void evalRequest(NetworkRequestInfo n) {
if (n.requested == false && n.score < mScore &&
n.request.networkCapabilities.satisfiedByNetworkCapabilities(
mCapabilityFilter) && acceptRequest(n.request, n.score)) {
needNetworkFor(n.request, n.score);
n.requested = true;
} else if (n.requested == true &&
(n.score > mScore || n.request.networkCapabilities.satisfiedByNetworkCapabilities(mCapabilityFilter) == false || acceptRequest(n.request, n.score) == false)) {
releaseNetworkFor(n.request);
n.requested = false;
}
}
private void evalRequest(NetworkRequestInfo n) { if (n.requested == false && n.score < mScore && n.request.networkCapabilities.satisfiedByNetworkCapabilities( mCapabilityFilter) && acceptRequest(n.request, n.score)) { needNetworkFor(n.request, n.score); n.requested = true; } else if ( 4000 n.requested == true && (n.score > mScore || n.request.networkCapabilities.satisfiedByNetworkCapabilities(mCapabilityFilter) == false || acceptRequest(n.request, n.score) == false)) { releaseNetworkFor(n.request); n.requested = false; } }然后数据网络就进行releaseNetworkFor操作:
[java]
view plain
copy
print?
@DcTracker.java
protected void releaseNetworkFor(NetworkRequest networkRequest) {
ApnContext apnContext = apnContextForNetworkRequest(networkRequest);
if (apnContext != null) apnContext.decRefCount();
}
@DcTracker.java protected void releaseNetworkFor(NetworkRequest networkRequest) { ApnContext apnContext = apnContextForNetworkRequest(networkRequest); if (apnContext != null) apnContext.decRefCount(); }而APN参数被删掉时将会触发数据业务的关闭:
[java]
view plain
copy
print?
@ApnContext.java
public void decRefCount() {
synchronized (mRefCountLock) {
if (mRefCount-- == 1) {
//关闭数据业务
mDcTracker.setEnabled(mDcTracker.apnTypeToId(mApnType), false);
}
}
}
@ApnContext.java public void decRefCount() { synchronized (mRefCountLock) { if (mRefCount-- == 1) { //关闭数据业务 mDcTracker.setEnabled(mDcTracker.apnTypeToId(mApnType), false); } } }然后数据业务就被关闭,从而完成网络切换的任务。
相关文章推荐
- 网络连接评分机制之再谈WIFI与数据切换过程
- 网络连接评分机制之再谈WIFI与数据切换过程
- 网络连接评分机制之再谈WIFI与数据切换过程(原)
- android网络的评分机制、连接国内ap wifi不回连问题
- Android连接管理的评分机制(WIFI,Ethernet,BT,移动数据
- 模拟QQ侧滑控件 实现三种界面切换效果(知识点:回调机制,解析网络json数据,fragment用法等)。
- 网络连接评分机制之NetworkFactory
- 网络连接评分机制之NetworkAgent
- 安卓网络连接全解:包括网络连接状态的监听、网络数据使用状态的监听、获取当前网络连接情况、启动wifi、获取当前连接wifi的网络情况、扫描wifi热点
- 数据业务建立流程之发起网络连接过程(原)
- 网络连接评分机制之NetworkFactory
- 网络连接评分机制之NetworkFactory
- Android中使用代码控制Wifi及数据连接网络开关
- 网络连接评分机制之NetworkFactory(原)
- Android中使用代码控制Wifi及数据连接网络开关
- 数据业务建立流程之发起网络连接过程
- 数据业务建立流程之发起网络连接过程