<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          Android WIFI 詳解

          作者: 時間:2016-10-08 來源:網(wǎng)絡(luò) 收藏

          最 近研究Wifi模塊,查了不少的相關(guān)資料,但發(fā)現(xiàn)基本上是基于android2.0版本的的分析,而現(xiàn)在研發(fā)的android移動平臺基本上都是2.3的 版本,跟2.0版本的差別,在Wifi模塊上也是顯而易見的。2.3版本W(wǎng)ifi模塊沒有了WifiLayer,之前的WifiLayer主要負(fù)責(zé)一些復(fù) 雜的Wifi功能,如AP選擇等以提供給用戶自定義,而新的版本里面的這塊內(nèi)容基本上被WifiSettings所代替。

          本文引用地址:http://www.ex-cimer.com/article/201610/305545.htm

          本文就是基于android2.3版本的Wifi分析,主要分為兩部分來分別說明:

          (1) Wifi模塊相關(guān)文件的解析

          (2) Wpa_supplicant解析

          (3) Wifi的啟動流程(有代碼供參考分析)

          一,Wifi模塊相關(guān)文件解析

          1) wifisettings.java

          packages/apps/Settings/src/com/android/settings/wifiwifisettings.java

          該類數(shù)據(jù)部分主要定義了下面幾個類的變量:

          {

          private final IntentFilter mFilter;

          //廣播接收器,用來接收消息并做響應(yīng)的處理工作

          privatefinal BroadcastReceiver mReceiver;

          //這是一個掃描類,會在用戶手動掃描 AP時被調(diào)用

          privatefinal Scanner mScanner;

          private WifiInfo mLastInfo;

          //服務(wù)代理端,作為WifiService對外的接口類呈現(xiàn)

          privateWifiManager mWifiManager;

          //這個類主要實(shí)現(xiàn)Wifi的開閉工作

          privateWifiEnabler mWifiEnabler;

          //AP

          private AccessPoint mSelected;

          private WifiDialog mDialog;

          ……

          }

          wifiSettings類的構(gòu)造函數(shù)的主要工作:定義了一個IntentFilter(Intent過濾器)變量,并添加了六個動作,(了解 Android的intent機(jī)制的同學(xué)都知道什么意思,不明白的同學(xué)參考Intent機(jī)制的資料)接著定義一個廣播接收器,并有相應(yīng)的消息處理函數(shù),下 面是該構(gòu)造函數(shù)的定義:

          public WifiSettings() {

          mFilter = new IntentFilter();

          //intent機(jī)制中的intent消息過濾器,下面添加可以處理的動作

          mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);

          mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);

          mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);

          mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);

          mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);

          mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);

          //注冊了廣播接收器,用來處理接收到的消息事件

          mReceiver = new BroadcastReceiver() {

          @Override

          public void onReceive(Context context,Intent intent) {

          handleEvent(intent); //事件處理函數(shù)

          }

          };

          mScanner= new Scanner(); //手動掃描類

          }

          在廣播接收器中的相應(yīng)函數(shù)onReceive函數(shù)中有個handleEvent函數(shù),它就是用來處理廣播接收器接受到的intent消息的,它的功能是根 據(jù)intent消息中的動作類型,來執(zhí)行相應(yīng)的操作,每一種動作對應(yīng)了activity的一項(xiàng)消息處理能力。

          在oncreate函數(shù)中實(shí)例化了mWifiManager和mWifiEnabler兩個類,這兩個類對wifiSettings來說至關(guān)重要,它后面的定義的一系列函數(shù)都是通過調(diào)用這兩個類的相應(yīng)接口來實(shí)現(xiàn)的。

          ……

          mWifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);

          mWifiEnabler = new WifiEnabler(this,

          (CheckBoxPreference) findPreference(enable_wifi));

          ……

          WifiSettings中還定義了顯示菜單和響應(yīng)菜單鍵的函數(shù),即onCreateOptionsMenu()和 onOptionsItemSelected();還有響應(yīng)配置對話框中按鍵的onClick()函數(shù);最后定義了Scanner類,它是一個 handler的繼承類,實(shí)現(xiàn)了消息處理函數(shù),用于處理手動掃描的動作。

          2) WifiEnabler.java:

          packages/apps/Settings/src/com/android/settings/wifi/WifiEnabler.java

          private final Context mContext;

          private final CheckBoxPreference mCheckBox;

          //兩個重要成員

          private final WifiManager mWifiManager;

          private final IntentFilter mIntentFilter;

          wifienabler類中定義了四個成員變量很重要,mContext,mCheckBox,mWifiManager和mReceiver,其中 mContext用于獲取mwifiManager實(shí)例,mReceiver用來接收底層發(fā)來的消息,mCheckBox用來改變UI的狀態(tài)。

          該 類中定義了幾個重要的函數(shù)onPreferenceChange,handleWifiStateChanged和 handleStateChanged,onPreferenceChange用來處理按下的Enbler鍵,它會調(diào)用 mWifiManager.setWifiEnabled(enable),另外兩個用來處理接受的消息事件。

          在類的構(gòu)造函數(shù)中,主要做了一下工作:初始化了mContext,mCheckBox,mWifimanager,并且初始化了一個 mIntentFilter變量,添加了三個動作,在構(gòu)造函數(shù)的上面定義了一個廣播接收器,用來接收下層傳來的消息,并根據(jù)intent動作的類型調(diào)用相 應(yīng)的處理函數(shù),這個廣播接收器在onResum函數(shù)中被注冊。

          public WifiEnabler(Context context, CheckBoxPreferencecheckBox) {

          mContext= context;

          mCheckBox = checkBox;

          mOriginalSummary = checkBox.getSummary();

          checkBox.setPersistent(false);

          mWifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);

          mIntentFilter= new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);

          // Theorder matters! We really should not depend on this. :(

          mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);

          mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);

          }

          這 里可以總結(jié)為:如果上層需要監(jiān)聽或收到下層的消息,那么就要通過定義一個BroadcastReciever,并將它注冊,當(dāng)然在接受到消息后應(yīng)該有處理 消息的函數(shù),然后在onReciever函數(shù)中根據(jù)消息調(diào)用相應(yīng)的處理函數(shù),這里的消息通知機(jī)制是Intent,在BroadcastReciever類 的onReciever函數(shù)的參數(shù)中可以看出。


          上一頁 1 2 3 4 5 6 7 8 下一頁

          關(guān)鍵詞:

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();