版本:Android 4.4
做TV方案需要添加一个有线网络优先功能,而Android中默认为WIFI优先
首先从安卓对外开放的接口入手,通过
ConnectivityManager.getActivelinkProperties();
方法能够获取到当前网络连接的对象,通过此对象可以解析IP,网关,DNS等信息,这些不是本篇重点,如何解析这些内容下次单独列一篇文章。
通过这个接口方法,找到在framework中ConnectivityService.java的实现
可以看到通过 mActiveDefaultNetwork这个变量在getlinkProperties方法中获取到了我们需要的信息。
在ConnectivityService中查找mActiveDefaultNetwork这个变量赋值的地方,可以看到在handleConnect方法中对mActiveDefaultNetwork进行了赋值
handleConnect方法是私有方法,继续在ConnectivityService类中查找handleConnect的调用,最终查询到是在NetworkStateTrackerHandler的handleMessage中的NetworkStateTracker.EVENT_STATE_CHANGED这一条消息有对handleConnect方法进行调用。
通过上网查询得知NetworkStateTrackerHandler是处理网络变化的消息类,而NetworkStateTracker.EVENT_STATE_CHANGED会在网络状态变化时调用,通过查看代码,其中有一个handleCaptivePortalTrackerCheck方法,在这个方法中会对连接的网络进行检测,判断它与其他网络的优先级,以此决定是否切换网络
这其中主要的判断是在isNewNetTypePreferredOverCurrentNetType方法中实现的,当返回true时便切换网络。
在这个方法中通过mActiveDefaultNetwork变量拿到当前连接的网络对象,以及通过传入的type获取需要比较的对象,当传入对象的优先级高于当前对象时或者mNetworkPreference与当前网络不一致时就会切换网络。
可以看到这里有两个判断条件都能够满足我们的需求,将有线网络的priority调高,或者将mNetworkPreference设置为代表有线网络的FLAG。
这里我们先查看priority是在哪里进行定义的。在这个方法中可以看到是通过mNetConfigs这个数组来获取对象信息,我们查看这个数组在何处进行的初始化赋值操作。
在ConnectivityService的构造方法中,我们可以看到mNetConfigs是从networkAttributes这个数组中获取到数值并存入数组。
找到这个数组在资源文件中定义的位置,通过阅读注释,可以知道
查看此目录下的文件,确实如此。将优先级设置为2之后此需求顺利解决。
上面有提到过,还有另一个变量mNetworkPreference,当这个变量与当前网络不一致时,也会返回true,进行切换网络的操作,我们继续查找mNetworkPreference变量的赋值流程。
在ConnectivityService的构造方法中,可以看到首先是从getPersistedNetworkPreference方法获取到一个值,后续通过遍历数组和判断将n赋值给mNetworkPreference。
我们查看 mPriorityList数组可以看到,实际上也是通过mNetConfigs的优先级拿到最高的优先级对象,并保存此对象的type,所以与上面修改priority也是同一个道理,到此这个问题就顺利解决了。



