Android getSystemService用法实例总结

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

static jboolean android_net_wifi_scanCommand(JNIEnv* env, jobject clazz)
{
  jboolean result;
  // Ignore any error from setting the scan mode.
  // The scan will still work.
  (void)doBooleanCommand("DRIVER SCAN-ACTIVE", "OK");
  result = doBooleanCommand("SCAN", "OK");
  (void)doBooleanCommand("DRIVER SCAN-PASSIVE", "OK");
  return result;
}

当 wpa_supplicant 处理完 SCAN 命令后,它会向控制通道发送事件通知扫描完成,从而
wifi_wait_for_event 函数会接收到该事件,由此 WifiMonitor 中的 MonitorThread 会被执行来出来这个事件,

void handleEvent(int event, String remainder) {
  case SCAN_RESULTS:
    mWifiStateTracker.notifyScanResultsAvailable();
    break;

WifiStateTracker 则接着广播发送 SCAN_RESULTS_AVAILABLE_ACTION 这个 Intent
        case EVENT_SCAN_RESULTS_AVAILABLE:
             mContext.sendBroadcast(new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

WifiLayer 注册了接收 SCAN_RESULTS_AVAILABLE_ACTION 这个 Intent,所以它的相关
处理函数 handleScanResultsAvailable 会被调用,在该函数中,先会去拿到 SCAN 的结果(最终是往 wpa_supplicant 发送 SCAN_RESULT 命令并读取返回值来实现的),

复制代码 List<ScanResult> list = mWifiManager.getScanResults();
对每一个扫描返回的 AP,WifiLayer 会调用 WifiSettings 的 onAccessPointSetChanged 函数,从而最终把该 AP 加到 GUI 显示列表中。

 

public void onAccessPointSetChanged(AccessPointState ap, boolean added) {
   AccessPointPreference pref = mAps.get(ap);
   if (added) {
    if (pref == null) {
      pref = new AccessPointPreference(this, ap);
      mAps.put(ap, pref);
    } else {
      pref.setEnabled(true);
    }
    mApCategory.addPreference(pref);
   }
}

3. 配置 AP 参数

当用户在 WifiSettings 界面上选择了一个 AP 后,会显示配置 AP 参数的一个对话框,
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
   if (preference instanceof AccessPointPreference) {
    AccessPointState state = ((AccessPointPreference)preference).getAccessPointState();
    showAccessPointDialog(state, AccessPointDialog.MODE_INFO);
   }
}