上一节《
Wifi服务框架介绍》介绍了WIFI的大致框架,本文主要介绍连接管理中的几个重要角色,包括:
NetworkInfo、NetworkAgent、ConnectivityService、ConnectivityManager等。
为了便于讨论,本文选取一个具体问题展开分析,那就是: 当当前的网络连接变为不可用时,系统如何自动切换其他可用的网络连接的。
接下来我们通过代码来认识一下他究竟如何在网络连接与ConnectivityService之间进行通讯。
先来看一下这个类的定义:
然后来看其构造方法:
为了便于讨论,本文选取一个具体问题展开分析,那就是: 当当前的网络连接变为不可用时,系统如何自动切换其他可用的网络连接的。
我们知道,当手机在使用移动数据上网时,如果进入WIFI环境,手机将会自动连上WIFI使用数据,而当WIFI失去覆盖或者关闭WIFI时,手机又会自动连上移动数据,那么这个机制是如何实现的呢?本文从WIFI框架触发,跟踪当WIFI被disconnect时,如何切换为数据网络。
一、WifiStateMachine更新状态
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.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介绍
"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);

最低0.47元/天 解锁文章
2505

被折叠的 条评论
为什么被折叠?



