手機(jī)狀態(tài)欄信號(hào)顯示流程淺析

版權(quán)聲明:本文為作者原創(chuàng),轉(zhuǎn)載必須注明出處。

轉(zhuǎn)載請(qǐng)注明出處:http://m.itdecent.cn/p/d4e0eccb7639

最近在分析手機(jī)狀態(tài)欄信號(hào)展示的一個(gè)問(wèn)題,把a(bǔ)ndroid源碼稍微擼了一下,對(duì)整個(gè)流程有了一個(gè)粗略的了解,寫篇文章記錄一下。代碼參考的是android 7.0源碼。

先來(lái)看看整個(gè)流程的時(shí)序圖:

image.jpeg

Android的網(wǎng)絡(luò)信號(hào)欄的顯示刷新也是SystemUI的一部分,主要業(yè)務(wù)邏輯也是在SystemUI這模塊內(nèi)的,整個(gè)流程的開(kāi)始是在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)各種系統(tǒng)廣播來(lái)監(jiān)控比如 wifi, sim卡狀態(tài), service state ,飛行模式等。通過(guò)CallbackHandler將它自己和SignalClusterView聯(lián)系起來(lái),CallbackHandler和SignalClusterView同時(shí)實(shí)現(xiàn)NetworkController中的接口SignalCallback, 通過(guò)在CallbackHandler的對(duì)象中調(diào)用SignalClusterView的方法來(lái)實(shí)現(xiàn)NetworkControllerImpl對(duì)SignalClusterView控制通信;NetworkControllerImpl通過(guò)執(zhí)行registerListeners( ) 來(lái)對(duì)所有MobileSignalController做個(gè)遍歷,執(zhí)行每個(gè)MobileSignalController 的registerListener(),來(lái)設(shè)置phoneStateListener監(jiān)聽(tīng)。

3、 MobileSignalController是對(duì)訂閱的廣播做處理的封裝類,每個(gè)廣播對(duì)應(yīng)一個(gè)MobileSignalController,進(jìn)行數(shù)據(jù)處理與封裝,主要是實(shí)現(xiàn)PhoneStateListener接口用來(lái)監(jiān)聽(tīng)service state、信號(hào)強(qiáng)度、通話狀態(tài)、移動(dòng)數(shù)據(jù)連接狀態(tài),設(shè)置相應(yīng)的顯示圖標(biāo)。然后將這些狀態(tài)和圖標(biāo)顯示屬性通過(guò)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通過(guò)updateTelephony來(lái)封裝數(shù)據(jù)(當(dāng)然包含SignalStrength的level),最后通過(guò)notifyListenersIfNecessary來(lái)傳遞給SignalClusterView.java負(fù)責(zé)UI的刷新。

5、SignalClusterView.java通過(guò)SignalCallback的回調(diào),調(diào)用apply()方法和內(nèi)部類PhoneState的apply()方法來(lái)完成最終的界面刷新。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,323評(píng)論 25 708
  • 十二年前,為了將兩張電影音樂(lè)cd中的三十支曲目和電影名稱一一對(duì)應(yīng)起來(lái),我和好朋友每個(gè)星期三下午都會(huì)湊在她的筆記...
    dolo釗閱讀 376評(píng)論 0 0
  • 只聽(tīng)樓梯響,不見(jiàn)人下來(lái) 只聽(tīng)樓梯響,不見(jiàn)人下來(lái),是漢語(yǔ)成語(yǔ),出自司馬文森《風(fēng)雨桐江》,比喻只是口頭說(shuō)說(shuō),沒(méi)有實(shí)際行...
    第九棵香樟樹(shù)閱讀 942評(píng)論 0 0
  • 1. 題目 請(qǐng)讀取出arr字符串中每個(gè)字母重復(fù)出現(xiàn)的次數(shù)分別是多少?如字符串a(chǎn)rr="abcdaabc",a重復(fù)出...
    jdzhangxin閱讀 1,038評(píng)論 0 4

友情鏈接更多精彩內(nèi)容