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();
}

具体流程如下流程图所示:

更多相关文章

  1. Android中dispatchDraw分析
  2. Android四大基本组件介绍与生命周期
  3. Android(安卓)Service AIDL
  4. Android调用天气预报的WebService简单例子
  5. Android(安卓)Activity的启动
  6. android打电话发短信
  7. android 拨打紧急号码,通话时开启免提功能实现
  8. Android调用.NET Webservice报org.ksoap2.serialization.SoapPri
  9. Android架构分析之使用自定义硬件抽象层(HAL)模块

随机推荐

  1. Android获取高清app图标代码分享
  2. android判断短信是否发送成功[动态注册广
  3. Android列表实现(1)_数组列表
  4. Android(安卓)SDK无法更新问题
  5. Android 自定义view的写法
  6. 只有安卓才会跳
  7. 超酷的 gankIO 客户端
  8. android 红外
  9. [置顶] android 瀑布流
  10. Android SDCard操作