閱讀514 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go isalpha &lt;ctype.h&gt; &lt;cctype&gt;
  下一篇:go HierarchicalStateMachine.java