1. 程式人生 > >Android 4.0 ICS SystemUI淺析——StatusBar結構分析

Android 4.0 ICS SystemUI淺析——StatusBar結構分析

      1.佈局概覽

      首先,我們通過hierarchyviewer這個工具來檢視一下系統啟動後的佈局情況(注:hierarchyviewer在SDK/tools目錄下,在windows環境下直接執行hierarchyviewer.bat,linux環境下終端執行./hierarchyviewer;安裝ADT外掛後也可以通過Eclipse呼叫hierarchyviewer來檢視)。如圖1.1:


圖 1.1

這裡簡單的介紹一下當前介面的元件,該介面為模擬器啟動後解鎖介面。其中包含了7個元件,從上到下依次為RecentsPanel、SatusBar、StatusBarExpanded、TrackingView、Keyguard、com.android.launcher/com.android.launcher2.Launcher、com.android.systemui.ImageWallpaper。

       RecentsPanel:指的是我們長按Home鍵彈出的“最近執行程式”。如圖1.2:


圖 1.2

       SatusBar:這就是我們的主角——狀態列。由於是剛啟動,因此沒有執行任何有通知的應用程式,如下圖1.3:


圖 1.3

        StatusBarExpanded:根據字面意思其實我們已經知道了,這實際上就是通知欄下拉時候的擴充套件介面。如圖1.4:


圖 1.4

注:因為模擬器實際上無法顯示出USB當前連線狀態,因此這裡換用真機截圖。

       TrackingView:指的是我們將通知欄下拉以後,除開StatusBarExpanded以外的地方。如圖1.5:


圖 1.5

           Keyguard:這就是螢幕鎖,因為目前已經解鎖,因此看不到任何佈局。

        com.android.launcher/com.android.launcher2.Launcher:就是我們的Launcher,如圖1.6:


圖 1.6

         com.android.systemui.ImageWallpaper:也就是桌布,是由SystemUI裡的ImageWallpaper來設定的。

       2.StatusBar之庖丁解牛

       根據前面的整體描述,相信大家已經對Android 4.0的介面有了一個整體的概念,那麼接下來就切入正題——StatusBar的結構分析。對於StatusBar的分析從以下兩方面入手:首先,從介面上分析。通過hierarchyviewer來觀察StatusBar的佈局結構;其次,通過程式碼分析各個元件的具體實現(注:本文主要從介面進行結構分析)。

       以為後面我將會用真機進行演示,因此這裡貼出真機的StatusBar結構圖以及原生的StatuBar結構圖,以進行對比。真機採用的是高通雙卡平臺,在原生基礎上進行的修改,原生StatusBar的結構如圖2.1,真機StatusBar結構如圖2.2:


圖 2.1


圖 2.2(看不清楚的朋友可以點這裡下載全部圖片)

          圖2.1和2.2中清晰的列出了StatusBar的結構組成,StatusBar實際上是由PhoneStatusBarView構成,而PhoneStatusBarView又細分成兩個大模組,分別是icons和ticker兩個佈局。我們知道,在通常情況下,系統左邊放置通知圖示(notificationIcons),中間放置狀態圖示(statusIcons)以及訊號圖示(signal_battery_cluster),右邊放置日期(clock),ticker預設是看不見的,因此實際上我們真正看到的StatusBar是icons的佈局。下面我們分別介紹這些獨立模組的結構。

        我將StatusBar的組成部件(notificationIcons、statusIcons、signal_battery_cluster、clock、ticker)分別使用了不同的背景,這樣就能清晰直觀的看到各個佈局之間的關係了(注:我使用的是高通的雙卡平臺)。如圖2.3和2.4:


圖 2.3


圖 2.4

在圖2.3和圖2.4中,各個顏色代表的含義如下:

紅色:notificationIcons,通知圖示,比如我們常見的360以及QQ等等,都會在這裡顯示自己的圖示;

紫色:statusIcons,狀態圖示,這裡會放置系統的一些狀態圖示,比如像藍芽、鬧鐘、耳機插入等等;

綠色:signal_battery_cluster,訊號以及電量圖示,這裡主要放置了wifi以及手機訊號和電池電量的圖示(注:沒有插入SIM卡);

黃色:clock,時鐘圖示;

藍色:ticker,通知資訊圖示,當系統接收到通知後,有的通知具有通知資訊,因此會通過ticker進行顯示,比如禁用360的懸浮窗,插拔SD卡等等;

        再次祭出我們的hierarchyviewer,檢視每個部分的組成結構。

        notificationIcons的佈局如圖2.5:


圖 2.5

           這裡和Android 4.0原生有一點點區別,因為這裡有一些類似於Android 2.3的改動,但整體上是差不多的。4個StatusBarIconView對應圖中的4個圖示,通過IconMerger也就是nocificationIcons進行整合並顯示。

       statusIcons的佈局如圖2.6所示:


圖 2.6

          從圖2.6我們可以知道,statusIcons是一個包含了8個StatusBarIconView的LinearLayout,每個StatusBarIconView存放不同的系統Icon,像這裡的藍芽、耳機插入、鬧鐘等等。

       signal_battery_cluster的佈局如圖2.7所示:


圖 2.7

          從圖2.7我們可以看到,這塊是結構比較複雜的一塊,因為與原生Android 4.0相比,高通使用了雙卡,所以這裡稍作了修改。

       clock的佈局如圖2.8所示:


圖 2.8

         我們這裡只看了一個Clock的佈局,實際上Clock繼承自TextView,後續在程式碼分析的時候會提到。

       最後讓我們看看ticker的佈局結構,如圖2.9:


圖 2.9

          圖2.9中可以看到,ticker由TickerView和ImageSwitcher組成,而ImageSwitcher由兩個自定義的ImageView構成,TickerView實際上就是兩個TextView的組合。

       3.StatusBar結構分析小結

       Android 4.0的StatusBar相對於Android 2.3的改動還是比較大的,對於StatusBar的分析,有利於對StatusBar的個性化定製,詳細瞭解各個模組的功能可以對Android系統有更加深入的認識。針對本次結構分析,更加熟悉了hierarchyviewer的使用,對於整個SystemUI中的StatusBar也有個更加深入的認知。

       後續將從程式碼的方向繼續分析Android 4.0中StatusBar的載入以及工作流程。敬請關注