分类: LINUX
2011-08-15 09:14:43
第三部分: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(); } 具体流程如下流程图所示: |