版權(quán)聲明:本文為作者原創(chuàng)档玻,轉(zhuǎn)載必須注明出處怀泊。
轉(zhuǎn)載請(qǐng)注明出處:http://www.reibang.com/p/d4e0eccb7639
最近在分析手機(jī)狀態(tài)欄信號(hào)展示的一個(gè)問題,把a(bǔ)ndroid源碼稍微擼了一下误趴,對(duì)整個(gè)流程有了一個(gè)粗略的了解霹琼,寫篇文章記錄一下。代碼參考的是android 7.0源碼。
先來(lái)看看整個(gè)流程的時(shí)序圖:
Android的網(wǎng)絡(luò)信號(hào)欄的顯示刷新也是SystemUI的一部分枣申,主要業(yè)務(wù)邏輯也是在SystemUI這模塊內(nèi)的售葡,整個(gè)流程的開始是在PhoneStatusBar.java內(nèi)的,
frameworks/base/packages/SystemUI/src/com/Android/systemui/statusbar/phone/PhoneStatusBar.java;
1忠藤、由PhoneStatusBar的makeStatusBarView()方法來(lái)加載布局挟伙。由于在Android系統(tǒng)中由三處地方會(huì)使用信號(hào)欄(狀態(tài)欄、鎖屏界面下的狀態(tài)欄以及下拉通知欄的快捷設(shè)置區(qū)域),這三個(gè)引用處分別是status_bar.xml模孩、keyguard_status_bar.xml像寒、status_bar_expanded_header.xml),實(shí)例化三個(gè)對(duì)象瓜贾,并在這個(gè)方法中為每一個(gè)SignalClusterView.java對(duì)象綁定兩個(gè)控制器對(duì)象诺祸,NetworkControllerImpl、SecurityControllerImpl;
2祭芦、NetworkControllerImpl筷笨,繼承于BroadcastReceive,實(shí)現(xiàn)NetworkController, 對(duì)象主要是負(fù)責(zé)作為信號(hào)欄數(shù)據(jù)控制類龟劲,onReceive中監(jiān)聽各種系統(tǒng)廣播來(lái)監(jiān)控比如 wifi, sim卡狀態(tài), service state ,飛行模式等胃夏。通過CallbackHandler將它自己和SignalClusterView聯(lián)系起來(lái),CallbackHandler和SignalClusterView同時(shí)實(shí)現(xiàn)NetworkController中的接口SignalCallback, 通過在CallbackHandler的對(duì)象中調(diào)用SignalClusterView的方法來(lái)實(shí)現(xiàn)NetworkControllerImpl對(duì)SignalClusterView控制通信;NetworkControllerImpl通過執(zhí)行registerListeners( ) 來(lái)對(duì)所有MobileSignalController做個(gè)遍歷昌跌,執(zhí)行每個(gè)MobileSignalController 的registerListener(),來(lái)設(shè)置phoneStateListener監(jiān)聽仰禀。
3、 MobileSignalController是對(duì)訂閱的廣播做處理的封裝類蚕愤,每個(gè)廣播對(duì)應(yīng)一個(gè)MobileSignalController答恶,進(jìn)行數(shù)據(jù)處理與封裝,主要是實(shí)現(xiàn)PhoneStateListener接口用來(lái)監(jiān)聽service state萍诱、信號(hào)強(qiáng)度悬嗓、通話狀態(tài)、移動(dòng)數(shù)據(jù)連接狀態(tài)裕坊,設(shè)置相應(yīng)的顯示圖標(biāo)包竹。然后將這些狀態(tài)和圖標(biāo)顯示屬性通過CallbackHandler傳遞給SignalClusterView對(duì)象中。
4籍凝、SignalStrength主要定義的是信號(hào)強(qiáng)度和顯示格數(shù)的關(guān)系周瞎, getLevel( )獲取手機(jī)當(dāng)前信號(hào)值,強(qiáng)度分為0-4饵蒂,0是最弱声诸,4是最強(qiáng)。在MobileSignalController通過updateTelephony來(lái)封裝數(shù)據(jù)(當(dāng)然包含SignalStrength的level)苹享,最后通過notifyListenersIfNecessary來(lái)傳遞給SignalClusterView.java負(fù)責(zé)UI的刷新双絮。
5浴麻、SignalClusterView.java通過SignalCallback的回調(diào),調(diào)用apply()方法和內(nèi)部類PhoneState的apply()方法來(lái)完成最終的界面刷新囤攀。