ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
} catch (Throwable e) {
reportWtf(\ } try {
Slog.i(TAG, \
wifi = new WifiService(context);//实例化WifiService ServiceManager.addService(Context.WIFI_SERVICE, wifi); } catch (Throwable e) {
reportWtf(\ }
跟踪frameworks/base/services/java/com/android/server/ ConnectivityService.Java for (int targetNetworkType : mPriorityList) { final NetworkStateTracker tracker; try {
tracker = netFactory.createTracker(targetNetworkType, config); } catch (IllegalArgumentException e) {...}
tracker.startMonitoring(context, mTrackerHandler);////启动Monitoring WifiStateTracker 会创建 WifiMonitor 接收来自底层的事件, WifiService 和 WifiMonitor 是整个模块的核心。WifiService 负责启动关闭 wpa_supplicant、启动关闭 WifiMonitor 监视线程和把命令下发给 wpa_supplicant,
WifiMonitor 则负责从 wpa_supplicant 接收事件通知。
也就是说WifiService负责wifi整个流程的控制,而WifiMonitor负责监视底层的事件
② 连接AP(Access Point,无线访问接入点) 1. 激活wifi
(packages/apps/Settings/src/com/android/settings/wifi/ WifiSettings .java) WifiSettings 在初始化的时候配置了由WifiEnabler 来处理Wifi 按钮 public void onActivityCreated(Bundle savedInstanceState) { Switch actionBarSwitch = new Switch(activity);
mWifiEnabler = new WifiEnabler(activity, actionBarSwitch);//初始化WifiEnabler 对象 }
当用户按下 Wifi 按钮后, Android 会调用 WifiEnabler 的 onPreferenceChange, 再由 WifiEnabler调用 WifiManager 的 setWifiEnabled 接口函数,通过 AIDL,实际调用的是 WifiService 的setWifiEnabled 函数,在处理该消息的代码中做真正的激活工作
当使能成功后,会广播发送 WIFI_STATE_CHANGED_ACTION 这个 Intent 通知外界 WIFI已 经 成 功 激活 了 。 WifiEnabler 创 建 的 时 候 就 会 向 Android 注 册 接 收WIFI_STATE_CHANGED_ACTION,当有有可用的WIFI连接时会接收到SCAN_RESULTS_AVAILABLE_ACTION,从而开始扫描。
public WifiSettings() {
mFilter = new IntentFilter(); //当WIFI功能开启或关闭时会收到
mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
//当手机扫描到有可用的WIFI连接时会收到
mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION); //当连接请求状态发生改变时会收到
mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION); mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION); //当网络状态发生变化时会收到
mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION); /// M: add no WAPI certification action
mFilter.addAction(WifiManager.NO_CERTIFICATION_ACTION);
mReceiver = new BroadcastReceiver() { @Override
public void onReceive(Context context, Intent intent) { handleEvent(context, intent); } };
mScanner = new Scanner(); mManuallyConnect = false; }
直接跟踪handleEvent()方法:
private void handleEvent(Context context, Intent intent) { String action = intent.getAction();
if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN));
} else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) || WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) ||
WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) { updateAccessPoints();
} else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) { SupplicantState state = (SupplicantState) intent.getParcelableExtra( WifiManager.EXTRA_NEW_STATE); if (!mConnected.get()) {
updateConnectionState(WifiInfo.getDetailedStateOf(state)); }
} else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { NetworkInfo info = (NetworkInfo) intent.getParcelableExtra( WifiManager.EXTRA_NETWORK_INFO); mConnected.set(info.isConnected());
changeNextButtonState(info.isConnected()); updateAccessPoints();
updateConnectionState(info.getDetailedState());
if (mAutoFinishOnConnection && info.isConnected()) { Activity activity = getActivity(); if (activity != null) {
activity.setResult(Activity.RESULT_OK); activity.finish(); }
return; } }
private void updateAccessPoints() {
// Safeguard from some delayed event handling if (getActivity() == null) return;
final int wifiState = mWifiManager.getWifiState();
switch (wifiState) {
case WifiManager.WIFI_STATE_ENABLED: // 所有接入点的结合 final Collection accessPoints = constructAccessPoints();
if (accessPoints.size() == 0) {
addMessagePreference(R.string.wifi_empty_list_wifi_on); }
if (!mExt.isCatogoryExist()) {
for (AccessPoint accessPoint : accessPoints) {
getPreferenceScreen().addPreference(accessPoint); } }
break; 。
2. 查找并添加AP
成功开启WIFI,即getWifiState()返回为WIFI_STATE_ENABLED时首先会调用constructAccessPoints(),在constructAccessPoints()这个方法中调用mWifiManager.getConfiguredNetworks()与mWifiManager.getScanResults()来分别获取已保存
与可用的WIFI热点网络;调用addPreference(accessPoint),是往页面添加显示搜索到的WIFI热点网络
private List constructAccessPoints() {
ArrayList accessPoints = new ArrayList();
/** Lookup table to more quickly update AccessPoints by only considering objects with the
* correct SSID. Maps SSID -> List of AccessPoints with the given SSID. */
Multimap
/// M: empty ap list
mExt.emptyCategory(getPreferenceScreen());
final List
for (WifiConfiguration config : configs) { 。。。。。。 }
mExt.setLastPriority(config.priority);
AccessPoint accessPoint = new AccessPoint(getActivity(), config); accessPoint.update(mLastInfo, mLastState); accessPoints.add(accessPoint);
apMap.put(accessPoint.ssid, accessPoint); 。。。。。 } }
final List
for (ScanResult result : results) {
if (result.SSID == null || result.SSID.length() == 0 || result.capabilities.contains(\)) { continue; }
boolean found = false;
for (AccessPoint accessPoint : apMap.getAll(result.SSID)) { if (accessPoint.update(result)) found = true; }
if (!found) {