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