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。