2.4.1 create函数详解
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。