好么,2.0的源码没看几天,2.1的出了。
学习记录一下, 主要是Launcher启动时从数据库读取各种桌面物件信息到最后显示到屏幕桌面上的流程。
之前看2.0的时候,大概能分出来下面四个层次,2。1里面基本一样:
DB--mListInModel--mListInLauncher--ViewChildInCellLayout
I II III IV
扫了下代码,Launcher里面对这些东西有改动的重要是下面几个函数
FunA: bindAppWidget(LauncherAppWidgetInfo item)
1. workspace add view. -->IV,add
workspace.requestLayout.
2. mDesktopItems add item. -->III,add
FunB: bindFolders(HashMap folders)
1. clear . mFolder. -->III,clear
2. mfolder. add -->III,add all
FunC: bindItems(ArrayList shortcuts,int start,itn end)
1. mDesktopItems. add . -->III,add
2. case APP|Short|Folder|LiveFoder|Search
add in workspace.screen -->IV,add
workspace.requestLayout.
FunD: completeAddApplication(Context context,Intent,CellLayout.CellInfo)
1. find place ,
2. workspace.dropExternal -->I, fix or add.
FunE: completeAddAppWidget(Intent,CellInfo)
1. create a AppWidgetProviderInfo .from appWidgetId. -->III, add
2. if didnt find slot : delete it -->III,del
else add to db. --->I, add
3. mDesktopItems add -->III,add
4. workspace add -->IV,add
FunF: completeAddLivefodler(Intent,CellInfo)
1.add to DB -->I
2.workspace add view -->IV
FunG: completeAddShortcut(Intent,CellInfo)
1.add to DB -->I
2.workspace add view -->IV
FunH: finishBindingItems()
1. every folder . add to workspace screen . -->IV,add
2. requestLayout.
3. requesetFocus for that opend
FunL: startBinding()
1. workspace.everyCellLayout.removeAllViewsInLayout -->IV.clear
涉及到content的流程:
1 onCreate ,开机 或者重启
setupView初始化成员变量,然后由startLoader(isLaunching==true) 函数进行装载。
startLoader这个函数,多数情况下这个boolean参数都是true,也就是说完全重新装载。只有在changeFolderName,也就是改变用户更改folder名字的时候,调用参数是false的状况。
你一定觉得false的时候,系统会很聪明的去做最小的修改吧?嘿嘿,尼采错了。
这个布尔参数只是用来调节后文会提到的那个Thread的权限的,用途是用户开机的时候及早显示免得用户对着黑屏无聊- -b
两种情况做的事情还是一样的:完全的重读重绘,从I->II->III->IV完全走一遍。
他做的事情对应上面层次结构里的I->II->III->IV,
先把内容从ContentProvider读出到自己的成远变量, 然后传递给Launcher,最后传给workspace的CellLayout的每个CellInfo的View,也就是画到屏幕上。
具体来说,分以下几步:
1)创建一个LoaderThread,然后mLoaderThread.start来启动run函数
2)run
函数第一步:loadWorkspace .
把数据库中Launcher上的所有app,shortcut,search,folder,livefolder,appwidget.分类读出来,前
面2个放在一个arraylist,两个folder放入 HashMap,
appwidget放入第二个arraylist这样分成三类。这里searchWidget是个怪东西,长着widget的个儿,跑app那里去混。
3)run函数第二步:bindWorkspace
这个函数可以通过Callback这个神气的东西找到launcher,然后向他的workspace发射刚才读出来的两个数组。即包含了所有的数据库中记录的Launcher上的物件。
主要的,他通过callback调用三个launcher的函数:
Launcher.startBinding (即前面的FunL,把workspace的当前所有的view清空),
Launcher.bindItems(Func,绑定或者说装载App,search,显示到屏幕),
Launcher.bindFolders(FunB,邦好folder相关)
Launcher.bindAppWidget(FunA,绑定widget,显示到屏幕)
最后,调用Launcher.finishBindingItems() ,上面提到的FunH, 把所有的folder装载上,该显示的folder用4*4个cell显示起来。
细心的看官可能发现,三个bind函数,唯独bindFolders是只在III层操作,不和IV层相关,即不修改workspace的view的,原来是藏在finishBindingItems这个函数来作了。
4) run函数第三步 。 调用loadAllApps和bindAllApps
两个函数一看就不是不山寨我们loadWorkspace和bindWorkspace的嘛。反正就是读出来调用Launcher.bindAllApplications邦起来。
我这么说是为了方便理解,事实上app那块儿mAllAppsList我。。觉得他写的特棒,各种缓存各种区别各种花哨。直接看不懂。
到这里launcher的onCreate就差不多了,机器界面上该显示的也都显示上了。
2 添加
Launcher 上面有两种方式可以添加app快捷方式或者widget,分别是主界面空白处长按或者按下Menu选ADD。
其实点来点去,最后都是到了addItems()这个函数,他弹出一个窗口,让你选想要添加的物件。
这些东西基本会调用一个startActivityForResult
而这些返回的Result回到Launcher的时候,会得到相应的处理
具体的处理在onActivityResult函数里面。
3 删除
删除 没啥好说的
分清楚I,II,III,IV有点用。 想在哪个层次上作修改,对照着来还蛮快。
阅读(1524) | 评论(0) | 转发(1) |