create函数的代码如下所示。
NetworkManagementService.java::create
public static NetworkManagementService create(Context context)throws InterruptedException {
// 创建一个NMService对象
final NetworkManagementService service = new NetworkManagementService(context);
final CountDownLatch connectedSignal = service.mConnectedSignal;
service.mThread.start();// 启动NMService中的一个线程
// connectedSignal用于等待某个事情的发生。此处是等待mThread完成初始化工作
connectedSignal.await();
return service;
}
create函数非常简洁,其主要工作就是创建一个NMService对象并启动其中一个线程。create返回前需要确保mThread线程完成初始化工作。下面来看看NMService的构造函数。
NetworkManagementService.java
private NetworkManagementService(Context context) {
mContext = context;
// 对模拟器的处理
if ("simulator".equals(SystemProperties.get("ro.product.device"))) return;
/*
NativeDaemonConnector是Java Framework中一个特别的类,它用于连接指定的socket,并发送和接收
socket数据。
此处,"netd"参数代表目标socket。NetdCallbackReceiver为具体的socket连接及消息处理对象。
1.当Netd连接成功后,NetdCallbackReceiver的onDaemonConnected函数将被调用。
2.当收到来自Netd的数据后,NetdCallbackReceiver的onEvent函数将被调用。
NativeDaemonConnector代码比较简单,感兴趣的读者不妨自行阅读。
*/
mConnector = new NativeDaemonConnector(
new NetdCallbackReceiver(), "netd", 10, NETD_TAG, 160);
// 创建一个线程,其Runnable对象就是mConnector
mThread = new Thread(mConnector, NETD_TAG);
/*
把自己添加到Watchdog中的监控队列中。这样,NMService将受到Watchdog的监控,一旦NMService
出现异常,Watchdog将自杀以重启Android Java World。对Watchdog感兴趣的读者不妨阅读《深
入理解Android:卷Ⅰ》4.5.3节“Watchdog分析”。
*/
Watchdog.getInstance().addMonitor(this);
}
对上述代码来说,最重要的是NetdCallbackReceiver,下面来看看。
NetworkManagementService.java::NetdCallbackReceiver
private class NetdCallbackReceiver implements INativeDaemonConnectorCallbacks {
public void onDaemonConnected() {
if (mConnectedSignal != null) {
// 通知NMService构造函数中的connectedSignal.await()返回
mConnectedSignal.countDown();
mConnectedSignal = null;
} else {// mMainHandler和mThread线程绑定
mMainHandler.post(new Runnable() {
public void run() {
prepareNativeDaemon(); // 下节介绍
}
});
}
}
// 处理来自Netd的消息
public boolean onEvent(int code, String raw, String[] cooked) {
switch (code) {// 目前NMService只处理下面三种Command对应的消息
case NetdResponseCode.InterfaceChange: // 对应InterfaceCmd
......// 略去具体的处理逻辑
case NetdResponseCode.BandwidthControl:// 对应BandwidthControlCmd
......
case NetdResponseCode.InterfaceClassActivity:// 和IdletimerCmd有关
......
default:
break;
}
return false;
}
}
create及相关函数都比较简单,此处不详述,下面来看systemReady。