天天看點

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中

詳細序列圖如下:

Android的StatusBar分析

繼續閱讀