514
技術社區[雲棲]
Android的StatusBar分析
這裏僅討論狀態欄右半部分,不包括Notification部分。開機初始化相關略。以電池電量顯示為例,大概關鍵步驟如下:
1 通過BroadcastReceiver機製,StatusBarPolicy中注冊的mIntentReceiver收到BatteryService廣播的ACTION_BATTERY_CHANGED事件觸發;
2 調用updateBattery(intent)開始更新電池狀態欄;
3 從intent中解析需要的字段,調用StatusBarManager的setIcon()。StatusBarManager是客戶端使用的狀態欄管理類;
4 通過IBinder機製跨進程調用StatusBarManagerService的setIcon()。StatusBarManagerService派生於IStatusBarService.Stub,是狀態欄管理的服務端,是具體實現;
5 StatusBarManagerService有一個StatusBarIconList成員,這個list成員在StatusBarManagerService創建時,從R.array.config_statusBarIcons加載生成。StatusBarManagerService的setIcon()過程中,會又"battery"字段獲得在StatusBarIconList中的索引,再由包名、圖片id和等級創建StatusBarIcon實例,並將這個實例更新StatusBarIconList中所獲得索引對應項;
6 調用CommandQueue的setIcon()。CommandQueue派生於IStatusBar.Stub,有一個內部接口Callbacks,這個接口的實現就是StatusBarService。CommandQueue、StatusBarService和StatusBarManager屬於同一個進程,而StatusBarManagerService是一個係統級服務,它們之間必然需要通過IBinder進程間通信;
7 CommandQueue用於處理狀態欄、通知相關的請求,內部維護了一個事件隊列,setIcon()會創建一個OP_SET_ICON的massege,發送給Handler處理;
8 CommandQueue內部也有一個StatusBarIconList實例,這個實例是由StatusBarService創建。在處理OP_SET_ICON的massege前,會先通過getViewIndex獲得圖標View的位置索引viewIndex,(因為有些圖標有可能為空)再更新StatusBarIconList,最後調用Callbacks,也就是StatusBarService的addIcon()或者updateIcon();
9 以addIcon()為例,StatusBarService的addIcon()會創建一個新的StatusBarIconView,將第5步中所創建的StatusBarIcon實例設置進去,然後把這個view添加到LinearLayout的viewIndex位置。
這樣一個電池相關圖標就在狀態欄上添加或者更新了。刪除操作類似。
另:
IStatusBarService.aidl和IStatusBar.aidl在platform\frameworks\base\core\java\com\android\internal\statusbar中
<string-array name="config_statusBarIcons"> <item><xliff:g >ime</xliff:g></item> <item><xliff:g >sync_failing</xliff:g></item> <item><xliff:g >sync_active</xliff:g></item> <item><xliff:g >gps</xliff:g></item> <item><xliff:g >bluetooth</xliff:g></item> <item><xliff:g >nfc</xliff:g></item> <item><xliff:g >tty</xliff:g></item> <item><xliff:g >speakerphone</xliff:g></item> <item><xliff:g >mute</xliff:g></item> <item><xliff:g >volume</xliff:g></item> <item><xliff:g >wifi</xliff:g></item> <item><xliff:g >cdma_eri</xliff:g></item> <item><xliff:g >data_connection</xliff:g></item> <item><xliff:g >phone_evdo_signal</xliff:g></item> <item><xliff:g >phone_signal</xliff:g></item> <item><xliff:g >battery</xliff:g></item> <item><xliff:g >alarm_clock</xliff:g></item> <item><xliff:g >secure</xliff:g></item> <item><xliff:g >clock</xliff:g></item> </string-array>
詳細序列圖如下:
最後更新:2017-04-02 06:52:02