2.4.1 create函数详解

create函数的代码如下所示。

[—>NetworkManagementService.java::create]

  1. public static NetworkManagementService create(Context context)
  2. throws InterruptedException {
  3. // 创建一个NMService对象
  4. final NetworkManagementService service = new NetworkManagementService(context);
  5. final CountDownLatch connectedSignal = service.mConnectedSignal;
  6. service.mThread.start();// 启动NMService中的一个线程
  7. // connectedSignal用于等待某个事情的发生。此处是等待mThread完成初始化工作
  8. connectedSignal.await();
  9. return service;
  10. }

create函数非常简洁,其主要工作就是创建一个NMService对象并启动其中一个线程。create返回前需要确保mThread线程完成初始化工作。下面来看看NMService的构造函数。

[—>NetworkManagementService.java]

  1. private NetworkManagementService(Context context) {
  2. mContext = context;
  3. // 对模拟器的处理
  4. if ("simulator".equals(SystemProperties.get("ro.product.device"))) return;
  5. /*
  6. NativeDaemonConnector是Java Framework中一个特别的类,它用于连接指定的socket,并发送和接收
  7. socket数据。
  8. 此处,"netd"参数代表目标socket。NetdCallbackReceiver为具体的socket连接及消息处理对象。
  9. 1.当Netd连接成功后,NetdCallbackReceiver的onDaemonConnected函数将被调用。
  10. 2.当收到来自Netd的数据后,NetdCallbackReceiver的onEvent函数将被调用。
  11. NativeDaemonConnector代码比较简单,感兴趣的读者不妨自行阅读。
  12. */
  13. mConnector = new NativeDaemonConnector(
  14. new NetdCallbackReceiver(), "netd", 10, NETD_TAG, 160);
  15. // 创建一个线程,其Runnable对象就是mConnector
  16. mThread = new Thread(mConnector, NETD_TAG);
  17. /*
  18. 把自己添加到Watchdog中的监控队列中。这样,NMService将受到Watchdog的监控,一旦NMService
  19. 出现异常,Watchdog将自杀以重启Android Java World。对Watchdog感兴趣的读者不妨阅读《深
  20. 入理解Android:卷Ⅰ》4.5.3节“Watchdog分析”。
  21. */
  22. Watchdog.getInstance().addMonitor(this);
  23. }

对上述代码来说,最重要的是NetdCallbackReceiver,下面来看看。

[—>NetworkManagementService.java::NetdCallbackReceiver]

  1. private class NetdCallbackReceiver implements INativeDaemonConnectorCallbacks {
  2. public void onDaemonConnected() {
  3. if (mConnectedSignal != null) {
  4. // 通知NMService构造函数中的connectedSignal.await()返回
  5. mConnectedSignal.countDown();
  6. mConnectedSignal = null;
  7. } else {// mMainHandler和mThread线程绑定
  8. mMainHandler.post(new Runnable() {
  9. public void run() {
  10. prepareNativeDaemon(); // 下节介绍
  11. }});
  12. }
  13. }
  14. // 处理来自Netd的消息
  15. public boolean onEvent(int code, String raw, String[] cooked) {
  16. switch (code) {// 目前NMService只处理下面三种Command对应的消息
  17. case NetdResponseCode.InterfaceChange: // 对应InterfaceCmd
  18. ......// 略去具体的处理逻辑
  19. case NetdResponseCode.BandwidthControl:// 对应BandwidthControlCmd
  20. ......
  21. case NetdResponseCode.InterfaceClassActivity:// 和IdletimerCmd有关
  22. ......
  23. default: break;
  24. }
  25. return false;
  26. }
  27. }

create及相关函数都比较简单,此处不详述,下面来看systemReady。