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

本文深入解析Android中的NetworkAgent,包括其在数据连接中的作用、创建过程和分数更新方法,重点关注直接与间接更新分值的细节,阐述了如何影响网络连接状态的决策。
        前面介绍了开机过程中各个网络提供者的初始化过程,其实就是创建自己的NetworkFactory,并将其注册到ConnectivityService。而在介绍NetworkFactory的时候,我们看到该类的官方注释中有这么一句描述:
        "A NetworkFactory is an entity that creates NetworkAgent objects."
        这说明NetworkFactory的主要作用还是用来创建NetworkAgent的,那么NetworkAgent是什么对象,而NetworkFactory与NetworkAgent又是什么关系呢?

        我们接下来介绍NetworkAgent。


一、NetworkAgent介绍


        其实在上一个文档《 Framework中的连接管理机制》中已经介绍过NetworkAgent相关知识了,现在我们来从另一个角度分析一下该对象的作用。
        从刚才NetworkFactory的注释我们知道,NetworkAgent是被NetworkFactory创建的,这里的创建并不是说在NetworkFactory内部创建NetworkAgent,而是说, 在NetworkFactory这个环境就绪之后,网络提供者才可以创建NetworkAgent。并且在一个NetworkFactory中可以创建不同的NetworkAgent,他们拥有不同的Capabilities等参数。
        而他们之间还有一个区别就是,NetworkFactory是在 系统初始化时就被创建,而NetworkAgent是在 真正接入网络时才会创建。
        我们用运营商之间的关系来比喻他们的关系。
        NetworkFactory相当于不同的运营商,比如中国电信、铁通、移动,他们具备联通互联网的能力,当用户入网时就决定了自己的运营商(即完成NetworkFactory初始化)。但同时在每个运营商内部又创建各个不同的接入点,比如对于中国电信来说,还分为上海电信、河北电信等,只有当用户打开电脑真正上网的时候,才会被分配具体的接入点(即完成NetworkAgent初始化)。
        也就是说,同一个NetworkFactory可以在不同的时刻根据需要创建不同的NetworkAgent,比如使用数据上网时,会根据当前的需要(发送MMS还是IMS,或者单纯上网)来创建不同参数的NetworkAgent(不同的APN参数)对象,然后将其注册到ConnectivityService中。

        下面我们跟踪一下数据连接的创建过程来看一下NetworkAgent的使用。


二、NetworkAgent创建过程


        当数据连接建立成功时,就会在DataConnection中进入DcActiveState的状态机,然后就会创建数据连接的NetworkAgent对象:
        @DataConnection.java
        private class DcActiveState extends State {
            @Override public void enter() {
                mRetryManager.restoreCurMaxRetryCount();
                mDcController.addActiveDcByCid(DataConnection.this);
                //更新当前的NetworkInfo状态
                mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, mNetworkInfo.getReason(), null);
                mNetworkInfo.setExtraInfo(mApnSetting.apn);
                updateTcpBufferSizes(mRilRat);
                //数据建立成功,创建并注册NetworkAgent
                mNetworkAgent = new DcNetworkAgent(getHandler().getLooper(), mPhone.getContext(),
                        "DcNetworkAgent", mNetworkInfo, makeNetworkCapabilities(), mLinkProperties,
                        50);
            }
        }
        我们看到,当数据连接建立成功后,就会更新当前的NetworkInfo( 点击这里了解NetworkInfo),然后创建当前的NetworkAgent,并把NetworkInfo传递给NetworkAgent。
        下面我们来看NetworkAgent的创建过程:
        @NetworkAgent.java
        public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) {
            super(looper);
            LOG_TAG = logTag;
            mContext = context;
            if (ni == null || nc == null || lp == null) {
                throw new IllegalArgumentException();
            }


            ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService( Context.CONNECTIVITY_SERVICE);
            cm.registerNetworkAgent(new Messenger(this), new NetworkInfo(ni), new LinkProperties(lp), new NetworkCapabilities(nc), score, misc);
        }
        在NetworkAgent的创建过程中,只做了一件事情,就是将其注册到ConnectivityService中,而这里传递的参数包含当前NetworkAgent的Messenger(用于与ConnectivityService之间建立AsyncChannel通道)、传递进来的NetworkInfo、NetworkCapabilities、以及当前连接的分数score等。
        然后我们继续来看在ConnectivityService中的注册过程:
        @ConnectivityService.java
        public void registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo, LinkProperties linkProperties, NetworkCapabilities networkCapabilities, int currentScore, NetworkMisc networkMisc) {
            //权限检查
            enforceConnectivityInternalPermission();


            N
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值