三: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();
}
具體流程如下流程圖所示:
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();
}
具體流程如下流程圖所示:
沒有留言:
張貼留言