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

        上一节《 Wifi服务框架介绍》介绍了WIFI的大致框架,本文主要介绍连接管理中的几个重要角色,包括: NetworkInfo、NetworkAgent、ConnectivityService、ConnectivityManager等。
        为了便于讨论,本文选取一个具体问题展开分析,那就是: 当当前的网络连接变为不可用时,系统如何自动切换其他可用的网络连接的

        我们知道,当手机在使用移动数据上网时,如果进入WIFI环境,手机将会自动连上WIFI使用数据,而当WIFI失去覆盖或者关闭WIFI时,手机又会自动连上移动数据,那么这个机制是如何实现的呢?本文从WIFI框架触发,跟踪当WIFI被disconnect时,如何切换为数据网络。


一、WifiStateMachine更新状态


        WifiStateMachine利用setNetworkDetailedState()方法更新WIFI状态, 如果WIFI网络被断开后,就会将DISCONNECTED的状态传递给setNetworkDetailedState(),此时WifiStateMachine就会把状态先同步到NetworkInfo,然后再更新到NetworkAgent对象:
        private boolean setNetworkDetailedState(NetworkInfo.DetailedState state) {
            boolean hidden = false;
            if (state != mNetworkInfo.getDetailedState()) {
                //更新NetworkInfo的状态
                mNetworkInfo.setDetailedState(state, null, mWifiInfo.getSSID());
                if (mNetworkAgent != null) {
                    //将最新状态发送到NetworkAgent
                    mNetworkAgent.sendNetworkInfo(mNetworkInfo);
                }
                sendNetworkStateChangeBroadcast(null);
                return true;
            }
            return false;
        }

        到这里就不得不介绍一下NetworkInfo和NetworkAgent了。


二、NetworkInfo介绍


        NetworkInfo用于标识一个网络连接的状态、类型等属性的,从其提供的public方法我们就能看出其提供了一个网络连接最基本的信息:
        @NetworkInfo.java
        //获取网络类型,TYPE_MOBILE/TYPE_WIFI/TYPE_MOBILE_MMS等
        public int getType() {}
        //获取网络类型名称
        public String getTypeName() {}
        //网络是否是CONNECTED或者CONNECTING状态
        public boolean isConnectedOrConnecting() {}
        //网络是否是CONNECTED状态
        public boolean isConnected() {}
        //设置网络是否可用
        public void setIsAvailable(boolean isAvailable) {}
        //判断网络是否可用
        public boolean isAvailable() {}
        //是否漫游状态
        public boolean isRoaming() {}
        //设置漫游状态
        public void setRoaming(boolean isRoaming) {}
        //获取网络的state、mReason等信息
        public DetailedState getDetailedState() {}
        应用程序可以 通过ConnectivityManager的getNetworkInfo()方法获取到该对象,并通过该对象查询当前的网络状态,比如可以这样获取当前是否有网络连接:
        private boolean isNetworkConnected() {
            final ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            if (connectivity == null) {
                return false;
            }
            final NetworkInfo info = connectivity.getActiveNetworkInfo();
            return info != null && info.isConnected();
        }
        上面是应用读取NetworkInfo的方法,那么当网络变化时,就应该由WIFI或者DATA去更新当前的NetworkInfo,而WifiStateMachine在setNetworkDetailedState中做的就是把当前的网络状态更新到NetworkInfo,即:
        mNetworkInfo.setDetailedState(state, null, mWifiInfo.getSSID());

        更新完NetworkInfo之后,需要将其更新到ConnectivityManager才可被其他应用读取到,那么如何将其更新到ConnectivityManager呢?这就需要NetworkAgent来完成了。


三、NetworkAgent介绍


        NetworkAgent的作用可以从其官方描述中略知一二:
        "A Utility class for handling for communicating between bearer-specific code and ConnectivityService."
        这句话描述了NetworkAgent的作用: 他是某个网络连接与ConnectivityService之间的通讯的工具
        接下来我们通过代码来认识一下他究竟如何在网络连接与ConnectivityService之间进行通讯。
        先来看一下这个类的定义:
        public abstract class NetworkAgent extends Handler {}
        我们发现,这是一个Handler的子类,并且他是一个抽象类(abstract), 需要在子类中被实例化
        然后来看其构造方法:
        public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score) {
            this(looper, context, logTag, ni, nc, lp, score, null);
        }
        public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) {
            super(looper);
            mContext = context;
            if (ni == null || nc == null || lp == null) {
                throw new IllegalArgumentException();
            }
            //获取ConnectivityManager对象,并向其注册自己
            ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService( Context.CONNECTIVITY_SERVICE);
       
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值