Android Wifi模块分析(三) 本文来自: http://hi.baidu.com/anly_jun/blog/item/65e26e117e09ebcda6ef3f56.html 2010-02-05 17:13
第三部分: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();
}

具体流程如下流程图所示:
Android Wifi模块分析(三)_第1张图片
Android Wifi模块分析(三)_第2张图片

更多相关文章

  1. android studio的问题整理(如何删除模块(Module))
  2. Windows环境下Android 源码模块下载
  3. Android ListView 之 SimpleAdapter 二 (包含 item 中按钮监听)
  4. Android的按钮按下效果
  5. Android用悬浮按钮实现翻页效果
  6. Android 让按钮闪烁(点击的时候停止闪烁)
  7. Android单选按钮组(RadioGroup)的用法

随机推荐

  1. android工具之TraceView学习笔记
  2. Android4.1 关于Rotation相关的Configura
  3. Android上通过gcc编译普通的C程序
  4. android 版本更新
  5. Android之Room
  6. android 屏幕上面画线
  7. [置顶] Android中的dispatchTouchEvent()
  8. Android(安卓)SDK安装失败处理办法
  9. Android中WARNING: Application does not
  10. Android开发EditText属性