Home screen可以說是一個手機的最重要應用,就像一個門戶網站的首頁,直接決定了使用者的第一印象。下面對home screen做一簡要分析。
home screen的代碼位於packages/apps/Launcher目錄。從檔案launcher.xml,workspace_screen.xml可獲知home screen的UI結構如所示:
整個homescreen是一個包含三個child view的FrameLayout(com.android.launcher.DragLayer)。
第一個child就是案頭com.android.launcher.Workspace。這個案頭又包含三個child。每個child就對應一個案頭。這就是你在Android上看到的三個案頭。每個案頭上可以放置下列對象:應用捷徑,appwidget和folder。
第二個child是一個SlidingDrawer控制項,這個控制項由兩個子控制群組成。一個是com.android.launcher.HandleView,就是Android案頭下方的把手,當點擊這個把手時,另一個子控制項,com.android.launcher.AllAppsGridView就會彈出,這個子控制項列出系統中當前安裝的所有類型為category.launcher的Activity。
第三個child是com.android.launcher.DeleteZone。當使用者在案頭上長按一個widget時,把手位置就會出現一個垃圾桶形狀的控制項,就是這個控制項。
在虛擬桌面上可以擺放四種類型的對象:
1. ITEM_SHORTCUT,應用捷徑
2. ITEM_APPWIDGET,app widget
3. ITEM_LIVE_FOLDER,檔案夾
4. ITEM_WALLPAPER,牆紙。
類Favorites(LauncherSettings.java)和類LauncherProvider定義了一個content provider,用來儲存案頭上可以放置的幾個對象,包括shortcut, search和clock等。
類AddAdapter(AddAdapter.java)列出了這四個類型 對象。當使用者在案頭空白處長按時,下列函數序列被執行:
Launcher::onLongClick -->
Launcher::showAddDialog -->
Launcher::showDialog(DIALOG_CREATE_SHORTCUT); -->
Launcher::onCreateDialog -->
Launcher::CreateShortcut::createDialog:這個函數建立一個彈出式對話方塊,詢問使用者是要添加什麼(捷徑,appwidget, 檔案夾和牆紙)其內容就來自AddAdapter。
類Favorites(LauncherSettings.java)和類LauncherProvider定義了一個content provider,用來儲存案頭上可以放置的幾個對象,包括shortcut, search和clock等。
類DesktopItemsLoader負責將案頭上所有的對象從content provider中提取。
線程private ApplicationsLoader mApplicationsLoader負責從包管理器中擷取系統中安裝的應用列表。(之後顯示在AllAppsGridView上)。ApplicationsLoader::run實現:
1)通過包管理器列出系統中所有類型為Launcher,action為MAIN的activity;
2)對每一個Activity,
a) 將Activity相關中繼資料資訊,如title, icon, intent等緩衝到appInfoCache;
b) 填充到ApplicationsAdapter 中。填充過程中用到了一些小技巧,每填充4(UI_NOTIFICATION_RATE)個activity更新一下相應view。
在Launcher::onCreate中,函數startLoaders被調用。而該函數接著調用loadApplications和loadUserItems,分別擷取系統的應用列表,以及顯示在案頭上的對象列表(捷徑,appwidget,folder等)。
Launcher上排列的所有應用表徵圖由AllAppsGridView對象呈現。這個對象是一個GridView。其對應的Adapter是ApplicationsAdapter,對應的model則是ApplicationInfo數組。數組內容是由ApplicationsLoader裝載的。
private class ApplicationsLoader implements Runnable。
類簡介:
AddAdapter:添加案頭元素的適配器。
AllAppsGridView:Icon列表的的主介面,繼承gridView。
DeleteZone:luancher的刪除地區,繼承ImageView。
DragController:拖動控制介面。
DragLayer:整個launcher的父節點,繼承FrameLayout,實現介面DrayController。
DragSource:拖動源介面,定義了void onDropCompleted(View target, boolean success)。
DropTarget:拖動目標,定義很多拖動過程需要的方法:onDrop,onDragEnter,onDragOver,onDragExit,acceptDrop。
HandleView:launcher抽屜的開關,不過在android2.2已經沒用抽屜了。
Launcher:整個launcher的程式的入口,代碼量最大的一個檔案。
Workspace:整個介面layout,幾個視窗就是他下面的子節點。
Launcher中實現了MVC模式(M:launchermode , V:draglayer ,C: launcher),以此為主線,可以得到 Launcher對各個組件管理的細節(如drag的實現)。