网络连接评分机制之再谈WIFI与数据切换过程(原)

原创 2015年10月08日 14:26:49
        前面几节介绍了网络评分机制的运行流程,下面我们再次通过案例来梳理一下评分机制在使用过程中的体现。
        用户原本在用数据上网,但是如果到了一个有WIFI的环境,并连接上了WIFI,此时用户的手机将会自动断开数据网络,这是如何做到的呢?
        当用户来到WIFI环境时,如果连上了某个WIFI,那么此时的WIFI状态机将会进入L2ConnectedState状态,然后会更新当前NetworkInfo状态为CONNECTING状态,并用该NetworkInfo创建WIFI的NetworkAgent对象,同时标明当前WIFI分值为60。即:
            mNetworkAgent = new WifiNetworkAgent(getHandler().getLooper(), mContext, "WifiNetworkAgent", mNetworkInfo, mNetworkCapabilitiesFilter, mLinkProperties, 60);
        然后在NetworkAgent初始化过程中将会向ConnectivityService注册,然后ConnectivityService就会创建WIFI的NetworkAgentInfo对象:
            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中,其中就包括数据网络:
        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分值
        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;
            }
        }
        然后数据网络就进行releaseNetworkFor操作
        @DcTracker.java
        protected void releaseNetworkFor(NetworkRequest networkRequest) {
            ApnContext apnContext = apnContextForNetworkRequest(networkRequest);
            if (apnContext != null) apnContext.decRefCount();
        }
        而APN参数被删掉时将会触发数据业务的关闭
        @ApnContext.java
        public void decRefCount() {
            synchronized (mRefCountLock) {
                if (mRefCount-- == 1) {
                    //关闭数据业务
                    mDcTracker.setEnabled(mDcTracker.apnTypeToId(mApnType), false);
                }
            }
        }
        然后数据业务就被关闭,从而完成网络切换的任务。
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android5.1网络切换策略分析

最近在在5.1移植了以太网过来,移植的过程并没有什么大问题,修改了框架上的代以及添加了Settings代码,以太网调试就基本完工了,后面只是修改下布局即可。 但是调试网络切换的时候出现了大问题。WIF...
  • Fighting4344
  • Fighting4344
  • 2015年10月14日 18:55
  • 4588

Android5.0网络评分与切换策略

1.frameworks/base/core/java/android/net/NetworkFactory.java private void evalRequest(NetworkReq...
  • tankai19880619
  • tankai19880619
  • 2015年04月20日 17:08
  • 3277

三、Android 网络评分机制

在前两节简单介绍了连接管理的大致框架,数据链接的准备工作,包括APN的初始化与默认APN使能,DcTracker的构造,包括各种事件的注册等工作。但是数据链接的打开不止是只有用户主动去打开,Andro...
  • xiabodan
  • xiabodan
  • 2016年12月20日 18:15
  • 1742

Android -- 网络模块中NetworkFactory与NetworkAgent的通信机制

Android -- NetworkFactory与NetworkAgent的通信机制 在上一篇博文中讲到,EthernetNetworkFactory包揽了Ethernet所有的网络管理操作,这...
  • csdn_of_coder
  • csdn_of_coder
  • 2016年06月11日 19:26
  • 3087

网络连接评分机制之NetworkAgent(原)

前面介绍了开机过程中各个网络提供者的初始化过程,其实就是创建自己的NetworkFactory,并将其注册到ConnectivityService。而在介绍NetworkFactory的时候,我们看到...
  • u010961631
  • u010961631
  • 2015年10月08日 14:06
  • 5709

Android5.0网络评分导致的以太网不能连接

一、现象 恢复出厂设置以后;开机向导连接wifi后连接有线网络不成功,重启之后才能成功。 概率性出现。 二、log对比 1.成功 D/EthernetNetworkFactory( 2068): up...
  • tankai19880619
  • tankai19880619
  • 2015年04月17日 17:13
  • 6195

android Wifi自动连接

转载自:http://blog.csdn.net/swqqcs/article/details/7493374 通过程序来实现wifi的自动连接。        这两天对android的wifi功...
  • dreamkid0924
  • dreamkid0924
  • 2016年11月22日 13:44
  • 880

[RK3288][Android6.0] WiFi之NetworkAgent对评分的更新

Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92上一篇看了NetworkFactory的使用过程,它是在系统初始化时就被创建,接下来在接入网络时...
  • kris_fei
  • kris_fei
  • 2017年07月24日 14:19
  • 733

Framework中的连接管理机制(原)

上一节《Wifi服务框架介绍》介绍了WIFI的大致框架,本文主要介绍连接管理中的几个重要角色,包括:NetworkInfo、NetworkAgent、ConnectivityService、Conne...
  • u010961631
  • u010961631
  • 2015年09月21日 17:40
  • 12788

Android -- Wifi的断开及关闭流程简介

Android -- Wifi的断开及关闭流程简介 当我们连接上一个AP时,Wifi的断开及关闭都会导致设备与AP之间的连接中断;关闭Wifi同时会导致Wifi断开。下面就简单介绍Wifi断开及关...
  • csdn_of_coder
  • csdn_of_coder
  • 2016年07月20日 21:27
  • 5054
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:网络连接评分机制之再谈WIFI与数据切换过程(原)
举报原因:
原因补充:

(最多只允许输入30个字)