网络连接评分机制之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();


            Net
  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Android中,Settings模块可以通过注册BroadcastReceiver来获取系统广播。其中,可以通过注册ACTION_NETWORK_STATE_CHANGED广播来获取网络状态变化的事件,包括NETWORK_NOT_FOUND_EVENT状态。 具体来说,可以在Settings模块中定义一个类继承BroadcastReceiver,然后在onReceive()方法中处理ACTION_NETWORK_STATE_CHANGED广播。在处理过程中,可以检查网络状态变化的extra数据,并根据其中包含的状态信息判断是否为NETWORK_NOT_FOUND_EVENT状态。 下面是一个示例代码: ``` public class NetworkStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); if (networkInfo != null && networkInfo.getState() == NetworkInfo.State.DISCONNECTED) { // 网络连接断开 } else if (networkInfo != null && networkInfo.getState() == NetworkInfo.State.CONNECTED) { // 网络连接成功 } } else if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { int event = intent.getIntExtra(NetworkAgent.EVENT_NETWORK_STATUS_CHANGED, -1); if (event == NetworkAgent.EVENT_NETWORK_NOT_FOUND) { // 网络连接未找到 } } } } ``` 在以上代码中,可以通过判断intent的action来确定接收到的广播类型,然后根据extra数据中包含的信息来判断网络状态变化的类型。其中,如果接收到的广播类型为ACTION_NETWORK_STATE_CHANGED,则可以通过获取extra数据中的NetworkAgent.EVENT_NETWORK_STATUS_CHANGED来判断网络状态是否为NETWORK_NOT_FOUND_EVENT状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值