Android-WiFi開發(fā)之 Android 4.4 代碼解析.

1. 前言:

  • Android 4.4 原生Settings代碼路徑: android-4.4.4/packages/apps/Settings.
  • 代碼架構(gòu): 相對簡單, 沒有按照MVC, 或者M(jìn)VP的形式來規(guī)劃源碼架構(gòu), 所以很多做系統(tǒng)開發(fā)的開發(fā)者很難聚焦來看源碼的實(shí)現(xiàn).

2. Android 4.4 WiFi 部分的源碼解析:

2.1 WIFI 模塊整體的功能結(jié)構(gòu):

  1. 開啟 WiFi
  2. 關(guān)閉 WiFi
  3. 獲取 WiFi 列表
  4. 持續(xù)掃描 WiFi ap.
  5. 連接網(wǎng)絡(luò)
  6. 忘記網(wǎng)絡(luò)
  7. 添加網(wǎng)絡(luò)
  8. 網(wǎng)絡(luò)高級設(shè)置等.

2.2 WiFi 整體功能示意圖:

image.png

2.3 WiFi 功能的主承載體:

image.png
  • WifiSettings.java, 本質(zhì)是繼承自 PreferenceFragment , 其路徑: com.android.settings.wifi
  • 對于安卓網(wǎng)絡(luò)廣播的處理, 也是在此類中, 在創(chuàng)建Fragment對象的時(shí)候, 進(jìn)行了一些列的初始化, 其中包含接收廣播的ACTION, 接收ACTION后對其處理的函數(shù)handleEvent(context, intent):
image.png
  • Scanner類: 集成自Handler的一個(gè)Object類, 是WifiSettings的一個(gè)內(nèi)部類, 負(fù)責(zé)在WiFi狀態(tài)開啟時(shí), 調(diào)度自身進(jìn)行掃描WiFi的任務(wù)輪詢, 并且暴露出 resume(), forceScan(), pause() 的函數(shù).
  • 其中:
    • resume() 是發(fā)消息給自身, 來執(zhí)行掃描的操作.
    • forceScan(), 強(qiáng)制掃描, 移除原有消息隊(duì)列中的任務(wù), 發(fā)送新的任務(wù), 強(qiáng)制重新掃描.
    • pause(), 是移除自身掃描任務(wù)的消息, 退出掃描輪詢操作.
image.png

2.4 生命周期函數(shù)及部分回調(diào)函數(shù)的處理:

  • onCreateView 中做了部分初始化. 如subMenu的一些處理, 添加網(wǎng)絡(luò), 高級設(shè)置等.
image.png
  • onActivityCreate 中做了如下相關(guān)的參數(shù)初始化.
    • a. 初始化WiFi管理類, WifiManager.
    • b. 初始化連接, 保存, 忘記網(wǎng)絡(luò)的回調(diào)初始化. ActionListener.
    • c. wifi 開關(guān), 及動態(tài)偵測WiFi狀態(tài)的輔助類的初始化.
image.png
image.png
image.png
  • onResume 中, 注冊了WiFi狀態(tài)的監(jiān)聽廣播, 和WiFi列表及熱點(diǎn)變更,網(wǎng)絡(luò)狀態(tài)的廣播. 并更新當(dāng)前 ap.
image.png
  • onPause 中, 解除了onResume函數(shù)中注冊的相關(guān)廣播. 并且移除掉了掃描任務(wù). (可以理解為, 釋放資源, 避免內(nèi)存泄漏.)


    image.png
  • onCreateOptionsMenu 中, 則初始化, 添加了一些高級設(shè)置, 輔助WiFi的操作控件. 如下:


    image.png
  • onOptionsMenuSelected 中, 針對上述添加的控件, 做了一些特定的響應(yīng), 根據(jù)其itemId 來區(qū)分, 當(dāng)前操作的是哪個(gè)具體的菜單.
image.png
  • onCreateContextMenu 中, 針對當(dāng)前每一個(gè)WiFi列表中的, WiFi 網(wǎng)絡(luò), 添加了一些條目處理. 如果是未保存的網(wǎng)絡(luò), 則賦予其連接的動作. 如果是已保存網(wǎng)絡(luò), 則賦予其忘記網(wǎng)絡(luò), 修改網(wǎng)絡(luò)的動作.
image.png
  • onOptionsItemSelected 中, 針對選項(xiàng)操作菜單中的各個(gè)條目進(jìn)行一些列的UI 或 WiFi 操作處理.
image.png
  • onPreferenceTreeClick, 其實(shí)相當(dāng)于是ListView 的 onItemClickListener 的回調(diào)方法, 在Preference 列表中, 是對各條目點(diǎn)擊操作的回調(diào)函數(shù), 其中, 對于當(dāng)前網(wǎng)絡(luò)的連接的處理. 對于未保存, 無密碼的, 直接連接, 否則彈框讓用戶鍵入用戶密碼后, 進(jìn)行保存, 或連接.
image.png

2.5 關(guān)于 WIFI 刷新的那些事兒:

  • 之前提到的最重要的, 關(guān)于網(wǎng)絡(luò)廣播的回調(diào)及監(jiān)聽, 在handleEvent中做了處理, 包括更新當(dāng)前WiFi列表, 刷新網(wǎng)絡(luò)數(shù)據(jù)結(jié)構(gòu). (AccessPoint) 等, 均是此處接收到原生廣播后, 進(jìn)行的統(tǒng)一處理.
image.png
  • 關(guān)于刷新的那些事兒: 根據(jù)接收安卓系統(tǒng)廣播, 通過刷新數(shù)據(jù), 進(jìn)而開始刷新UI, 更新每個(gè) preference 條目的熱點(diǎn)數(shù)據(jù)結(jié)構(gòu)完成.
  • 通過監(jiān)聽 WiFi 狀態(tài)變化, (相關(guān)的ACTION: WifiManager.WIFI_STATE_CHANGED_ACTION) 更新 optionsMenu, 其實(shí), 根據(jù)WiFi狀態(tài)改變, 決定是否掃描. 相關(guān)的調(diào)用比較簡單. 見圖:
image.png
  • 通過監(jiān)聽底層掃描, 網(wǎng)絡(luò)配置變化, (相關(guān)的ACTION: WifiManager.SCAN_RESULTS_AVAILABLE_ACTION, WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION, WifiManager.LINK_CONFIGURATION_CHANGED_ACTION) 來更新 AccessPoint 數(shù)據(jù)結(jié)構(gòu), 進(jìn)而更新每個(gè) preference 持有的 accessPoint, 相當(dāng)于更新 ListView / RecyclerView 中itemView 的Tag. 相關(guān)的更新如下圖所示: (4.4 的做法, 是移除所有的 preference 容器中的所有 UI, 然后重新初始化, 沒做緩存).
image.png
  • 通過監(jiān)聽WiFi請求狀態(tài)的變化, (相關(guān)的ACTION: WifiManager.SUPPLICANT_STATE_CHANGED_ACTION) 來更新網(wǎng)絡(luò)連接狀態(tài), 更新每個(gè)條目中的 DetailedState 來刷新每個(gè)條目持有的accessPoint.
image.png
  • 通過網(wǎng)絡(luò)變化, (相關(guān)的ACTION: WifiManager.NETWORK_STATE_CHANGED_ACTION) 刷新熱點(diǎn), 更新連接狀態(tài). 相關(guān)代碼如下:
image.png
  • 通過監(jiān)聽網(wǎng)絡(luò)信號變化, (相關(guān)的ACTION: WifiManager.RSSI_CHANGED_ACTION) 刷新條目狀態(tài).
image.png

3. 小結(jié):

  1. 如上, 針對原生 Android Settings源代碼, 結(jié)合自身閱讀源碼的一些經(jīng)驗(yàn)和見解, 形成了如上文檔作為歸結(jié), 其一, 對源碼的理解會加深印象, 后期有疑問可快速查詢定位, 其二, 希望能對剛踏入系統(tǒng)開發(fā)者兄弟做一些入門指導(dǎo). 如上, 感謝~~~
  2. 如文章中有不合適之處, 或有疑問, 請簡信, 或郵箱告知. 亦可下方評論區(qū)留言.
  3. qq 郵箱: 1281641968@qq.com
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子巩那,更是在濱河造成了極大的恐慌显设,老刑警劉巖杰捂,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翰灾,死亡現(xiàn)場離奇詭異哮肚,居然都是意外死亡停局,警方通過查閱死者的電腦和手機(jī)很钓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來董栽,“玉大人码倦,你說我怎么就攤上這事《迹” “怎么了袁稽?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長擒抛。 經(jīng)常有香客問我推汽,道長补疑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任歹撒,我火速辦了婚禮莲组,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栈妆。我一直安慰自己胁编,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布鳞尔。 她就那樣靜靜地躺著嬉橙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寥假。 梳的紋絲不亂的頭發(fā)上市框,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機(jī)與錄音糕韧,去河邊找鬼枫振。 笑死鲜屏,一個(gè)胖子當(dāng)著我的面吹牛石景,可吹牛的內(nèi)容都是我干的等浊。 我是一名探鬼主播拧抖,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灶似!你這毒婦竟也來了奶赔?” 一聲冷哼從身側(cè)響起碾阁,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤愚墓,失蹤者是張志新(化名)和其女友劉穎予权,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浪册,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扫腺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了村象。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笆环。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖厚者,靈堂內(nèi)的尸體忽然破棺而出咧织,到底是詐尸還是另有隱情,我是刑警寧澤籍救,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站渠抹,受9級特大地震影響蝙昙,放射性物質(zhì)發(fā)生泄漏闪萄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一奇颠、第九天 我趴在偏房一處隱蔽的房頂上張望败去。 院中可真熱鬧,春花似錦烈拒、人聲如沸圆裕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吓妆。三九已至,卻和暖如春吨铸,著一層夾襖步出監(jiān)牢的瞬間行拢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工诞吱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舟奠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓房维,卻偏偏與公主長得像沼瘫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子咙俩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容