Android getSystemService用法实例总结

2019-12-10 19:15:58丽君

使能 WIFI WirelessSettings 在初始化的时候配置了由 WifiEnabler 来处理 Wifi 按钮,

private void initToggles() {
 mWifiEnabler = new WifiEnabler(
  this,
  (WifiManager) getSystemService(WIFI_SERVICE),
  (CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI));

当用户按下 Wifi 按钮后, Android 会调用 WifiEnabler 的 onPreferenceChange,    再由 WifiEnabler 调用 WifiManager 的 setWifiEnabled 接口函数,通过 AIDL,实际调用的是 WifiService 的 setWifiEnabled 函数,WifiService 接着向自身发送一条 MESSAGE_ENABLE_WIFI 消息,在处理该消息的代码中做真正的使能工作:首先装载 WIFI 内核模块(该模块的位置硬编码为"/system/lib/modules/wlan.ko" ), 然 后 启 动 wpa_supplicant ( 配 置 文 件 硬 编 码 为 "/data/misc/wifi/wpa_supplicant.conf") 再通过 WifiStateTracker 来启动 WifiMonitor 中的监视,线程。

private boolean setWifiEnabledBlocking(boolean enable) {
 final int eventualWifiState = enable ? WIFI_STATE_ENABLED :WIFI_STATE_DISABLED;
   updateWifiState(enable ? WIFI_STATE_ENABLING : WIFI_STATE_DISABLING);
   if (enable) {
    if (!WifiNative.loadDriver()) {
      Log.e(TAG, "Failed to load Wi-Fi driver.");
      updateWifiState(WIFI_STATE_UNKNOWN);
      return false;
    }
    if (!WifiNative.startSupplicant()) {
      WifiNative.unloadDriver();
      Log.e(TAG, "Failed to start supplicant daemon.");
      updateWifiState(WIFI_STATE_UNKNOWN);
      return false;
    }
    mWifiStateTracker.startEventLoop();
   }
    // Success!
    persistWifiEnabled(enable);
    updateWifiState(eventualWifiState);
    return true;
}

当使能成功后,会广播发送 WIFI_STATE_CHANGED_ACTION 这个 Intent 通知外界 WIFI
已 经 成 功 使 能 了 。 WifiEnabler 创 建 的 时 候 就 会 向 Android 注 册 接 收WIFI_STATE_CHANGED_ACTION,因此它会收到该 Intent,从而开始扫描。

private void handleWifiStateChanged(int wifiState) {
  if (wifiState == WIFI_STATE_ENABLED) {
   loadConfiguredAccessPoints();
   attemptScan();
  }

2. 查找 AP

扫描的入口函数是 WifiService 的 startScan,它其实也就是往 wpa_supplicant 发送 SCAN 命令。