Android getSystemService用法实例总结

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

4. 连接

当用户在 AcessPointDialog 中选择好加密方式和输入密钥之后,再点击连接按钮,Android就会去连接这个 AP。

private void handleConnect() {
   String password = getEnteredPassword();
   if (!TextUtils.isEmpty(password)) {
    mState.setPassword(password);
   }
   mWifiLayer.connectToNetwork(mState);
}

WifiLayer 会先检测这个 AP 是不是之前被配置过,这个是通过向 wpa_supplicant 发送
LIST_NETWORK 命令并且比较返回值来实现的,

// Need WifiConfiguration for the AP
WifiConfiguration config = findConfiguredNetwork(state);

如果 wpa_supplicant 没有这个 AP 的配置信息,则会向 wpa_supplicant 发送 ADD_NETWORK 命令来添加该 AP,

if (config == null) {
  // Connecting for the first time, need to create it
  config = addConfiguration(state,ADD_CONFIGURATION_ENABLE|ADD_CONFIGURATION_SAVE);
}

ADD_NETWORK 命 令 会 返 回 一 个 ID , WifiLayer 再 用 这 个 返 回 的 ID 作 为 参 数 向wpa_supplicant 发送 ENABLE_NETWORK 命令,从而让 wpa_supplicant 去连接该 AP。

// Make sure that network is enabled, and disable others
mReenableApsOnNetworkStateChange = true;
if (!mWifiManager.enableNetwork(state.networkId, true)) {
  Log.e(TAG, "Could not enable network ID " + state.networkId);
  error(R.string.error_connecting);
  return false;
}

5. 配置 IP 地址

当 wpa_supplicant 成功连接上 AP 之后,它会向控制通道发送事件通知连接上 AP 了,从而wifi_wait_for_event 函数会接收到该事件,由此 WifiMonitor 中的 MonitorThread 会被执行来出来这个事件,

void handleEvent(int event, String remainder) {
  case CONNECTED:
   handleNetworkStateChange(NetworkInfo.DetailedState.CONNECTED,remainder);
  break;