Android啓動Launcher過程


一LauncherApplication->onCreate
  1.//設置最小堆內存4M
  2.//建立應用圖標緩存器
  3.//建立LauncherModel
  4.//註冊Intent.ACTION_PACKAGE_ADDED,Intent.ACTION_PACKAGE_REMOVED,Intent.ACTION_PACKAGE_CHANGED事件監聽器
  LauncherModel作爲廣播接收器對上面3中事件進行監聽
  5.//添加對桌面favorites content provider 數據變化監聽器
   二Launcher->onCreate
  1.獲取LauncherApplication LauncherModel mIconCache等LauncherApplication初始化的對象
  2.新建拖放控制器new DragController(this)
  4.//獲取桌面組件管理器,啓動桌面組件host
  5.//從array.hotseats中加載所有的hotseats(熱鍵 如掛機按鈕,google瀏覽器)
  6.從launcher.preferences加載本地設置
  7.//設置壁紙尺寸寬度=display.getWidth()* WALLPAPER_SCREENS_SPAN,高度=display.getHeight()
  8.//加載佈局文件
  9.//初始化所有控件
  10.//從Bundle savedInstanceState獲取桌面持久化數據 設置mRestoring = true;
  11.如果mRestoring == false,調用LauncherModel加載桌面項 mModel.startLoader(this, true,isLanguageChange);
  a.LauncherModel.Loader.startLoader() 代碼同步處理
  b.新建LauncherModel.Loader.LoaderThread線程並啓動線程(桌面項加載,詳細見第三步)
  12.註冊Intent.ACTION_CLOSE_SYSTEM_DIALOGS廣播監聽
 三 桌面項加載 LauncherModel.Loader.LoaderThread.run:新線程執行
  1.等待主線程運行結束纔開始加載
  2.判斷是否先加載桌面;loadWorkspaceFirst = cbk != null ? (!cbk.isAllAppsVisible()) : true;
  3.loadWorkspaceFirst==true
  a.loadAndBindWorkspace()
  loadWorkspace():從數據庫launcher.db中查詢中所有桌面項構造對應類型的ItemInfo對象存入
  mItems,mAppWidgets,mFolders列表.
  bindWorkspace():
  1.laucher.startBinding(),異步調用,在主線程中handle
  //do no things
  2.laucher.bindItems(),異步調用,在主線程中handle
  1.根據ItemInfo對象創建桌面圖標view對象
  2.獲取item.screen, item.cellX, item.cellY, spanX, spanY,
  調用workspace.addInScreen添加到對應桌面的cell
  1.重新設置桌面圖標view 的layoutparam(類型爲cellLayout.layoutparam)
  2.根據item.screen獲取桌面的celllayout對象,也就是workspace下5個用戶桌面中的一個
  3.調用celllayout.addview方法把桌面圖標view對象添加爲celllayout的child,也就是爲用戶桌面添加一個桌面圖標
  4.桌面圖標view對象添加OnLongClickListener=laucher,由laucher負責監聽桌面圖標view的longclick事件
  5.如果桌面圖標是DropTarget對象,拖放控制器mDragController添加該view到拖放目的地列表
  3.laucher.bindFolders(),異步調用,在主線程中handle
  //launcher.mFolders.putAll(mFolders);
  4.laucher.bindAppWidget(),異步調用,在主線程中handle
  1.獲取LauncherAppWidgetInfo的appWidgetId
  2.獲取AppWidgetProviderInfo appWidgetInfo mAppWidgetManager.getAppWidgetInfo(appWidgetId)
  3.根據appWidgetInfo創建桌面組件的view AppWidgetHostView對象
  4.調用workspace.addInScreen添加到對應桌面的cell
  5.laucher.finishBindingItems(),異步調用,在主線程中handle
  mWorkspaceLoading=false
  b.loadAndBindAllApps();
  如果沒有加載apps或者改變了語言設置
  loadAllAppsByBatch();
  1.//設置package 查詢條件Intent.ACTION_MAIN Intent.CATEGORY_LAUNCHER
  2.//清空mAllAppsList mAllAppsList.clear();
  3.//packageManager 查詢所有應用pakages
  4.分批次mAllAppsList.add 應用pakages
  5.laucher.bindAllApplications()//異步調用
  mAllAppsGrid.setApps(apps)
  6.若分多個批次加載 laucher.bindAppsAdded()//異步調用
  mAllAppsGrid.addApps(apps);
  否則
  onlyBindAllApps();
  1.mAllAppsList.data.clone();
  2.laucher.bindAllApplications()//異步調用
  mAllAppsGrid.setApps(apps)
  4.loadWorkspaceFirst==false
  a.loadAndBindAllApps();
  b.loadAndBindWorkspace();

發佈了26 篇原創文章 · 獲贊 9 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章