ConnectivityService用来管理系统中所有网络,谁能连接,谁需要断开。在连接一个网络是,收集网络信息,通过ConnetivityManager提供给应用使用。
在WIFI连接过程中,到链路层L2ConnectedState状态时,有:
class L2ConnectedState extends State {
@Override
public void enter() {
mNetworkAgent = new WifiNetworkAgent(getHandler().getLooper(), mContext,
"WifiNetworkAgent", mNetworkInfo, mNetworkCapabilitiesFilter,
mLinkProperties, 60, mNetworkMisc);
}
}
WifiNetworkAgent集成自NetworkAgent,NetworkAgent作为一种网络的代理,和ConnectivityService建立联系。
private class WifiNetworkAgent extends NetworkAgent {
public WifiNetworkAgent(Looper l, Context c, String TAG, NetworkInfo ni, NetworkCapabilities nc, LinkProperties lp, int score, NetworkMisc misc) {
super(l, c, TAG, ni, nc, lp, score, misc);
}
}
NetworkAgent构造方法为:
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);
LOG_TAG = logTag;
mContext = context;
if (ni == null || nc == null || lp == null) {
throw new IllegalArgumentException();
}
if (VDBG) log("Registering NetworkAgent");
ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(
Context.CONNECTIVITY_SERVICE);
netId = cm.registerNetworkAgent(new Messenger(this), new NetworkInfo(ni),
new LinkProperties(lp), new NetworkCapabilities(nc), score, misc);
}
最后通过registerNetworkAgent向ConnectivityManager注册NetworkAgent。此处传入了networkinfo,wifi连接状态是CONNECTING, 传入了score = 60,looper参数是消息处理位置,这里是WifiStateMachine. registerNetworkAgent通过ConnectivityManager到达ConnectivityService.
public int registerNetworkAgent(Messenger messenger, NetworkInfo networkInfo,
LinkProperties linkProperties, NetworkCapabilities networkCapabilities,
int currentScore, NetworkMisc networkMisc) {
enforceConnectivityInternalPermission();