🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
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。