本文主要是介绍网络连接评分机制之NetworkAgent(原),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前面介绍了开机过程中各个网络提供者的初始化过程,其实就是创建自己的NetworkFactory,并将其注册到ConnectivityService。而在介绍NetworkFactory的时候,我们看到该类的官方注释中有这么一句描述: "A NetworkFactory is an entity that creates NetworkAgent objects."
这说明NetworkFactory的主要作用还是用来创建NetworkAgent的,那么NetworkAgent是什么对象,而NetworkFactory与NetworkAgent又是什么关系呢?
我们接下来介绍NetworkAgent。
一、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.javaprivate 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);//数据建立成功,创建并注册NetworkAgentmNetworkAgent = new DcNetworkAgent(getHandler().getLooper(), mPhone.getContext(),"DcNetworkAgent", mNetworkInfo, makeNetworkCapabilities(), mLinkProperties,50);}}
我们看到,当数据连接建立成功后,就会更新当前的NetworkInfo(
点击这里了解NetworkInfo),然后创建当前的NetworkAgent,并把NetworkInfo传递给NetworkAgent。
下面我们来看NetworkAgent的创建过程:
@NetworkAgent.javapublic 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.javapublic void registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo, LinkProperties linkProperties, NetworkCapabilities networkCapabilities, int currentScore, NetworkMisc networkMisc) {//权限检查enforceConnectivityInternalPermission();Net
这篇关于网络连接评分机制之NetworkAgent(原)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!