Android settings之Wifi学习 - 图文(2)

2020-02-20 22:41

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 apMap = new Multimap();

/// M: empty ap list

mExt.emptyCategory(getPreferenceScreen());

final List configs = mWifiManager.getConfiguredNetworks(); if (configs != null) {

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 results = mWifiManager.getScanResults(); if (results != null) {

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) {


Android settings之Wifi学习 - 图文(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:Agilent1100高压液相色谱仪维护保养知识

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: